Qt - 标准对话框
标准对话框的类型
QT为开发者提供了多种可复用的对话框类型,即QT标准对话框。QT标准对话框全部继承于QDialog类。常用标准对话框类型如下:
类 | 名称 | 描述 |
QMessageBox | 消息对话框 | 为用户提示重要信息,强制用户进行操作 |
QFileDialog | 文件选择对话框 | 用来获取系统中的文件路径 |
QColorDialog | 调色板 | 用来指定颜色 |
QInputDialog | 输入对话框 | 用于需要临时进行输入的场合 |
QFontDialog | 字体选择对话框 | 进行字体的选择 |
QProcessDialog | 进度条对话框 | 输出一个进度条 |
QPrintr | 打印对话框 | 打印的对话框 |
1. QMessageBox
QMessageBox 是 Qt 框架中常用的一个类,可以生成各式各样、各种用途的消息对话框,如图所示。
Qt 提供了 6 种通用的 QMessageBox 消息对话框,通过调用 QMessageBox 类中的 6 个静态成员方法,可以直接在项目中使用它们
/*参数:
- parent: 对话框窗口的父窗口
- title: 对话框窗口的标题
- text: 对话框窗口中显示的提示信息
- buttons: 对话框窗口中显示的按钮(一个或多个)
- defaultButton
1. defaultButton指定按下Enter键时使用的按钮。
2. defaultButton必须引用在参数 buttons 中给定的按钮。
3. 如果defaultButton是QMessageBox::NoButton, QMessageBox会自动选择一个合适的默认值。
*/
//显示带有标题和文本的简单关于框。
[static] void QMessageBox::about(QWidget *parent, const QString &title, const QString &text);
[static] void QMessageBox::aboutQt(QWidget *parent, const QString &title = QString())
// 显示一个信息模态对话框
[static] QMessageBox::StandardButton QMessageBox::information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton);
// 显示一个错误模态对话框
[static] QMessageBox::StandardButton QMessageBox::critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton);
// 显示一个问题模态对话框
[static] QMessageBox::StandardButton QMessageBox::question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = StandardButtons(Yes | No), QMessageBox::StandardButton defaultButton = NoButton);
// 显示一个警告模态对话框
[static] QMessageBox::StandardButton QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton);
QMessageBox::StandardButton 枚举类型值
枚举值 | 含 义 |
QMessageBox::Ok | 标有 “OK” 字样的按钮,通常用来表示用户接受或同意提示框中显示的信息。 |
QMessageBox::Open | 标有 “Open” 字样的按钮。 |
QMessageBox::Save | 标有 “Save” 字样的按钮。 |
QMessageBox::Cancel | 标有 “Cancel” 字样的按钮。点击此按钮,通常表示用户拒绝接受提示框中显示的信息。 |
QMessageBox::Close | 标有 “Close” 字样的按钮。 |
QMessageBox::Discard | 标有 “Discard” 或者 “Don’t Save” 字样的按钮,取决于运行平台。 |
QMessageBox::Apply | 标有 “Apply” 字样的按钮。 |
QMessageBox::Reset | 标有 “Reset” 字样的按钮。 |
QMessageBox::Yes | 标有 “Yes” 字样的按钮。 |
QMessageBox::No | 标有 “No” 字样的按钮。 |
1.1 创建消息对话框
QMessageBox msg(nullptr);//创建消息对话框
msg.setWindowTitle("this is msg's window title!");//设置窗口标题
msg.setText("this is QMessageBox 's message content");//设置文字
msg.setIcon(QMessageBox::Information);//设置图标
msg.addButton(QMessageBox::Ok);//添加按钮
msg.addButton(QMessageBox::Cancel);//添加按钮
int r = msg.exec(); // 以模态的形式在最顶层显示,等待用户做出选择
qDebug() << "r = " << r ;
执行效果:
1.2 静态函数
使用静态函数可用于直接创建 information()、question()、warning() 和 critical() 消息框。
int ret = QMessageBox::warning(this,tr("警告"),tr("文档已修改.\n是否要保存更改?"),QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,QMessageBox::Save);
执行效果:
2. QFileDialog
QFileDialog 对话框类是 QDialog 类的子类, 通过这个类可以选择要打开/保存的文件或者目录。关于这个类我们只需要掌握一些静态方法的使用就可以了。
创建一个QFileDialog最简单的方式是使用静态函数。如下所示:
/*
通用参数:
- parent: 当前对话框窗口的父对象也就是父窗口
- caption: 当前对话框窗口的标题
- dir: 当前对话框窗口打开的默认目录
- options: 当前对话框窗口的一些可选项,枚举类型, 一般不需要进行设置, 使用默认值即可
- filter: 过滤器, 在对话框中只显示满足条件的文件, 可以指定多个过滤器, 使用 ;; 分隔
- 样式举例:
- Images (*.png *.jpg)
- Images (*.png *.jpg);;Text files (*.txt)
- selectedFilter: 如果指定了多个过滤器, 通过该参数指定默认使用哪一个, 不指定默认使用第一个过滤器
*/
// 打开一个文件, 得到这个文件的绝对路径
[static] QString QFileDialog::getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options());
// 打开多个文件, 得到这多个文件的绝对路径
[static] QStringList QFileDialog::getOpenFileNames(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options());
// 打开一个文件夹, 得到这个文件夹的绝对路径
[static] QString QFileDialog::getExistingDirectory(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), QFileDialog::Options options = ShowDirsOnly);
// 打开一个文件夹, 使用这个文件夹来保存指定的文件
[static] QString QFileDialog::getSaveFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options());
2.1 文件打开对话框
打开一个文件, 得到这个文件的绝对路径
示例代码:
//方式一
QString fileName = QFileDialog::getOpenFileName(this,"Select one or more files to open","","Images (*.png *.xpm *.jpg)");
//方式二
QString fileName = QFileDialog::getOpenFileName(nullptr, QObject::tr("Open File"), QDir::homePath(), QObject::tr("All Files (*)"));
if (!fileName.isNull())
{
//fileName即是选择的文件名
}
else
{
//点是的取消
}

2.2 文件保存对话框
打开一个文件夹, 使用这个文件夹来保存指定的文件
示例代码:
QString fileName;
fileName = QFileDialog::getSaveFileName(this,"Select one or more files to open","","Images (*.png *.xpm *.jpg)");
if (!fileName.isNull())
{
//fileName是文件名
}
else
{
//点的是取消
}
"Image Files (*.png *.jpg *.bmp)" //多个文件使用空格分隔
"Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)" //多个过滤使用两个分号分隔
运行效果:
2.3 创建文件对话框
示例:
void MainWindow::on_pushButton_2_clicked()
{
//定义文件对话框类
QFileDialog *fileDialog = new QFileDialog(this);
//定义文件对话框标题
fileDialog->setWindowTitle(tr("打开图片"));
//设置默认文件路径
fileDialog->setDirectory(".");
//设置文件过滤器
fileDialog->setNameFilter(tr("Images(*.png *.jpg *.jpeg *.bmp)"));
//设置可以选择多个文件,默认为只能选择一个文件QFileDialog::ExistingFiles
fileDialog->setFileMode(QFileDialog::ExistingFiles);
//设置视图模式
fileDialog->setViewMode(QFileDialog::Detail);
//打印所有选择的文件的路径
QStringList fileNames;
if(fileDialog->exec())
{
fileNames = fileDialog->selectedFiles();
}
for(auto tmp:fileNames)
qDebug()<<tmp<<endl;
}
效果:
3. QColorDialog
QColorDialog提供了一个对话框用于选择颜色。
静态函数getColor()可以用于展示出对话框允许用户指定一个颜色。通过指定额外的选项参数ShowAlphaChannel,可以让用户在选择颜色的同时选择透明度。
通过点击"Pick Screen Color",用户可以拾取程序窗口内的颜色。
3.1 类型成员
1、enum QColorDialog::ColorDialogOption:此枚举指定影响颜色对话框外观的各种选项。
- ShowAlphaChannel:允许用户选择颜色的 alpha 分量。
- NoButtons:不显示确定和取消按钮。
- DontUseNativeDialog:使用 Qt 的标准颜色对话框而不是操作系统的原生颜色对话框。Windows系统看不出效果,下图是Mac下Qt标准颜色对话框和操作系统原生颜色对话框:
3.2 属性成员
currentColor : QColor
对话框中当前选定的颜色。
options : ColorDialogOptions
影响对话框外观的各种选项。默认情况下,所有选项都被禁用。
应在显示对话框之前设置选项。不能保证在对话框可见时设置它们会立即对对话框产生影响(取决于选项和平台)。
3.3 成员函数
1、QColorDialog(const QColor &initial, QWidget *parent = nullptr)
使用给定的父级和指定的初始颜色构造一个颜色对话框。
2、【信号】void colorSelected(const QColor &color)
在用户单击确定以选择要使用的颜色后,立即发出此信号。参数是所选颜色。
3、【信号】void currentColorChanged(const QColor &color)
只要对话框中的当前颜色发生变化,就会发出此信号。
4、【static】int customCount()
返回 QColorDialog 支持的自定义颜色的数量。
5、void done(int result)
重新实现:QDialog::done(int r)。
关闭对话框并将其结果代码设置为 result。如果此对话框与 exec() 一起显示,则 done() 导致本地事件循环完成,并且 exec() 返回结果。
6、【static】QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())
弹出带有给定窗口标题的模式颜色对话框,让用户选择一种颜色,然后返回该颜色。如果用户取消对话框,它会返回一个无效的(QColor::isValid())颜色。options 参数允许自定义对话框。
下面创建一个颜色对话框,使用的是静态函数。
QColor color = QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
qDebug() << "color: " << color;
7、void open(QObject *receiver, const char *member)
打开对话框并将其 colorSelected() 信号连接到接收者 receiver 和成员指定的槽 member。
当对话框关闭时,信号将与槽断开连接。
8、QColor selectedColor()
返回用户通过单击确定选择的颜色。
此颜色并不总是与 currentColor 属性所持有的颜色相同,因为用户可以在最终选择要使用的颜色之前选择不同的颜色。
9、【static】void setCustomColor(int index, QColor color)
【static】QColor customColor(int index)
设置 index 处的自定义颜色值。见上图。此功能不适用于 macOS 平台的原生颜色框。
【static】void setStandardColor(int index, QColor color)
【static】QColor standardColor(int index)
设置 index 处的标准颜色值。见上图。此功能不适用于 macOS 平台的原生颜色框。
10、void setOption(QColorDialog::ColorDialogOption option,bool on = true)
启用或清除给定的选项。
bool testOption(QColorDialog::ColorDialogOption option )
是否启用给定选项。
3.4 显示对话框
有三种方法可以让颜色对话框显示出来了
colorDialog->show();//第一种方法
colorDialog->setVisible(true);//二种方法
colorDialog->getColor();//第三种方法无法触发currentColorChanged(const QColor &color)。
示例代码
colorDialog = new QColorDialog;
colorDialog->setOption(QColorDialog::ShowAlphaChannel);
QPushButton *pushBtn = new QPushButton("添加颜色");
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(pushBtn);
connect(colorDialog, &QColorDialog::currentColorChanged,
this, &Widget::colorValue);
connect(pushBtn, &QPushButton::clicked, this, &Widget::showColorDialog);
this->setLayout(hLayout);
槽函数
void Widget::colorValue(const QColor &color)
{
int r, g, b, a;
color.getRgb(&r, &g, &b, &a);
qDebug() << r << " " << g << " "<< b << " " << a;
}
void Widget::showColorDialog()
{
colorDialog->show();
}
运行效果:
4. QInputDialog
QT中提供了预定义的输入对话框类QInputDialog,用于需要临时进行数据输入的场合。
4.1 创建输入对话框
QInputDialog idialog(this);
idialog.setWindowTitle("Enter Data");
idialog.setLabelText("Please Enter a int:");
idialog.setInputMode(QInputDialog::TextInput);//输入文本字符串
//idialog.setInputMode(QInputDialog::IntInput);//输入整型数
//idialog.setInputMode(QInputDialog::DoubleInput);//输入浮点数
if(idialog.exec() == QInputDialog::Accepted)
{
qDebug() << idialog.intValue();
}
运行效果:
4.2 静态函数
double getDouble(QWidget * parent, const QString & title, const QString & label,double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool * ok = 0, Qt::WindowFlags flags = 0)
int getInt(QWidget * parent, const QString & title, const QString & label, int value = 0, int min = -2147483647, int max = 2147483647, int step= 1, bool * ok = 0, Qt::WindowFlags flags = 0)
QString getItem(QWidget * parent, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool *ok = 0, Qt::WindowFlags flags = 0)
QString getText(QWidget * parent, const QString & title, const QString & label,QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0)
示例代码:
int ret = QInputDialog::getInt(this,"提示","请输入大小");
//double ret = QInputDialog::getDouble(this,"提示","请输入大小");
//QString ret = QInputDialog::getText(this,"提示","请输入文本");
qDebug()<<"ret = "<<ret;
运行效果:
5. QFontDialog
QT中提供了预定义的字体对话框类QFontDialog,用于提供选择字体的对话框部件。
5.1 成员函数
QFont::QFont();
/*
参数:
- family: 本地字库中的字体名, 通过 office 等文件软件可以查看
- pointSize: 字体的字号
- weight: 字体的粗细, 有效范围为 0 ~ 99
- italic: 字体是否倾斜显示, 默认不倾斜
*/
QFont::QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false);
// 设置字体
void QFont::setFamily(const QString &family);
// 根据字号设置字体大小
void QFont::setPointSize(int pointSize);
// 根据像素设置字体大小
void QFont::setPixelSize(int pixelSize);
// 设置字体的粗细程度, 有效范围: 0 ~ 99
void QFont::setWeight(int weight);
// 设置字体是否加粗显示
void QFont::setBold(bool enable);
// 设置字体是否要倾斜显示
void QFont::setItalic(bool enable);
// 获取字体相关属性(一般规律: 去掉设置函数的 set 就是获取相关属性对应的函数名)
QString QFont::family() const;
bool QFont::italic() const;
int QFont::pixelSize() const;
int QFont::pointSize() const;
bool QFont::bold() const;
int QFont::weight() const;
5.2 静态函数
//获取当前用户设置的字体样式
[static] QFont QFontDialog::getFont(bool *ok, const QFont &initial, QWidget *parent = nullptr, const QString &title = QString(), QFontDialog::FontDialogOptions options = FontDialogOptions());
[static] QFont QFontDialog::getFont(bool *ok, QWidget *parent = nullptr);
5.3 设置窗口字体
// QWidget 类
// 得到当前窗口使用的字体
const QWidget::QFont& font() const;
// 给当前窗口设置字体, 只对当前窗口类生效
void QWidget::setFont(const QFont &);
// QApplication 类
// 得到当前应用程序对象使用的字体
[static] QFont QApplication::font();
// 给当前应用程序对象设置字体, 作用于当前应用程序的所有窗口
[static] void QApplication::setFont(const QFont &font, const char *className = nullptr);
示例代码1:
通过静态函数getFont()来创建字体对话框
//代码演示:
bool bFlag = true;
//获取字体样式
QFont font = QFontDialog::getFont(&bFlag);
qDebug("当前选择的字体是[%s]-是否加粗[%d]-是否倾斜[%d]-字号[%d]", font.family().toUtf8().data(), font.bold(), font.italic(), font.pointSize()0);
//给当前窗口设置字体
setFont(font);
运行效果:
示例代码2:
不使用字体对话框,设置字体。
QFont font;
//微软雅黑:Microsoft YaHei //宋体:SimSun
font.setFamily("Microsoft YaHei"); // 设置字体族
font.setPointSize(10); // 设置字体大小
font.setBold(false); // 设置字体为加粗
m_label->setFont(font);
6. QProgressDialog
QT提供了预定义的进度对话框类QProgressDialog,用于显示进度信息和需要用户等待的场合。
// 构造函数
/*
参数:
- labelText: 对话框中显示的提示信息
- cancelButtonText: 取消按钮上显示的文本信息
- minimum: 进度条最小值
- maximum: 进度条最大值
- parent: 当前窗口的父对象
- f: 当前进度窗口的flag属性, 使用默认属性即可, 无需设置
*/
QProgressDialog::QProgressDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
QProgressDialog::QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
// 设置取消按钮显示的文本信息
[slot] void QProgressDialog::setCancelButtonText(const QString &cancelButtonText);
// 公共成员函数和槽函数
QString QProgressDialog::labelText() const;
void QProgressDialog::setLabelText(const QString &text);
// 得到进度条最小值
int QProgressDialog::minimum() const;
// 设置进度条最小值
void QProgressDialog::setMinimum(int minimum);
// 得到进度条最大值
int QProgressDialog::maximum() const;
// 设置进度条最大值
void QProgressDialog::setMaximum(int maximum);
// 设置进度条范围(最大和最小值)
[slot] void QProgressDialog::setRange(int minimum, int maximum);
// 得到进度条当前的值
int QProgressDialog::value() const;
// 设置进度条当前的值
void QProgressDialog::setValue(int progress);
bool QProgressDialog::autoReset() const;
// 当value() = maximum()时,进程对话框是否调用reset(),此属性默认为true。
void QProgressDialog::setAutoReset(bool reset);
bool QProgressDialog::autoClose() const;
// 当value() = maximum()时,进程对话框是否调用reset()并且隐藏,此属性默认为true。
void QProgressDialog::setAutoClose(bool close);
// 判断用户是否按下了取消键, 按下了返回true, 否则返回false
bool wasCanceled() const;
// 重置进度条
// 重置进度对话框。wascancelled()变为true,直到进程对话框被重置。进度对话框被隐藏。
[slot] void QProgressDialog::cancel();
// 重置进度对话框。如果autoClose()为真,进程对话框将隐藏。
[slot] void QProgressDialog::reset();
// 信号
// 当单击cancel按钮时,将发出此信号。默认情况下,它连接到cancel()槽。
[signal] void QProgressDialog::canceled();
// 设置窗口的显示状态(模态, 非模态)
/*
参数:
Qt::NonModal -> 非模态
Qt::WindowModal -> 模态, 阻塞父窗口
Qt::ApplicationModal -> 模态, 阻塞应用程序中的所有窗口
*/
void QWidget::setWindowModality(Qt::WindowModality windowModality);
6.1 创建进度对话框
示例代码:
#include <QApplication>
#include <QDebug>
#include <QDialog>
#include <QObject>
#include <QProgressDialog>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QProgressDialog dlg(nullptr);
dlg.setWindowTitle("Updating...");
dlg.setLabelText("Downloading update from server...");
dlg.setMinimum(0);
dlg.setMaximum(100);
dlg.setValue(35);
dlg.exec();
return a.exec();
}
运行效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧