对话框窗口部件 QDialog
对话框(Dialog)是计算机图形用户界面(GUI)中的一种常见窗口类型,通常用于与用户进行交互、获取信息、提供反馈或执行特定任务。对话框的主要目的是与用户进行短期的、有限的交互,以完成特定的操作或任务,然后将控制返回给应用程序的主窗口或上下文。
模态与非模态对话框
按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:模态(model)和非模态(modeless)。
模态对话框(model dialog)
模态对话框阻塞了应用程序的主窗口或其他父窗口,直到用户完成对话框中的操作或关闭对话框。用户必须在对话框上完成交互后才能继续与应用程序交互。典型的模态对话框包括文件选择框、消息框、设置对话框等。
方法 1:exec()
QDialog dlg();
dlg.exec();
此方法实现的为全模态对话框,不仅会阻塞应用程序窗口,当调用 exec() 函数时,代码将不会继续向下执行,只有当对话框关闭才会返回。
方法 2:setModel()
QDialog dlg();
dlg.setModel(true);
dlg.show();
此方法实现的为半模态对话框,只会阻塞应用程序窗口,代码仍然继续向下执行。
方法 3:setWindowModality()
QDialog dlg();
dlg.setWindowModality(Qt::ApplicationModal);
dlg.show();
使用此方法实现的模态对话框也是半模态的。
setWindowModality()的参数设置要阻塞的窗口类型:
枚举值 | 值 | 说明 |
---|---|---|
Qt::NonModal | 0 | 非模态,不阻塞任何窗口 |
Qt::WindowModal | 1 | 模态,阻塞它的父窗口,所有的祖先窗口以及他们的子窗口 |
Qt::NonModal | 2 | 模态,阻塞应用程序所有的窗口 |
非模态对话框(modeless dialog)
非模态对话框与应用程序的其他部分同时存在,用户可以在对话框和主窗口之间自由切换。用户可以同时打开多个非模态对话框,而不必等待一个对话框完成才能处理其他任务。典型的非模态对话框包括查找和替换对话框。
QDialog dlg();
dlg.show();
标准对话框
Qt 提供了一些常用的对话框类型,它们全部继承自 QDialog 类,并增加了自己的特色功能,例如颜色、文件、字体、输入、提示、进度对话框等。此处只列举颜色、文件对话框和消息对话框,其余留给你自己练习!
颜色对话框
颜色对话框类 QColorDialog 提供了一个可以获取指定颜色的对话框部件。
#include <QColorDialog>
QColor color = QColorDialog::getColor(Qt::red, nullptr, QObject::tr("颜色对话框"));
qDebug() << "color" << color;
QColorDialog::getColor 的 3 个参数分别是:设置初始颜色、指定父窗口和设置对话框标题。
运行结果如图:
其实 QColorDialog::getColor 函数声明是这样的:
QColor
getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())
聪明的你可能已经发现了,这不是 4 个参数吗?咱咋没用呢?
options 是指定影响颜色对话框外观的各种选项,QColorDialog::ColorDialogOption 具体见下表:
枚举值 | 值 | 说明 |
---|---|---|
QColorDialog::ShowAlphaChannel | 1 | 允许用户选择颜色的alpha组件 |
QColorDialog::NoButtons | 2 | 不显示“确定”和“取消”按钮。(对于”live dialog”很有用。) |
QColorDialog::DontUseNativeDialog | 4 | 使用Qt的标准颜色对话框,而不是操作系统的本机颜色对话框 |
接下来我们使用 QColorDialog::ShowAlphaChannel 来显示 alpha 设置。运行程序查看结果如图所示:
文件对话框
文件对话框 QFileDialog 类提供了一个允许用户选择文件或文件夹的对话框。
#include <QFileDialog>
QString fileName = QFileDialog::getOpenFileName(nullptr, QObject::tr("Open File"), "D:\\", QObject::tr("文本文档(*.txt)"));
qDebug() << "fileName:" << fileName;
QFileDialog::getOpenFileName 的 4 个参数的作用分别是:指定父窗口、设置对话框标题、指定默认打开目录路径和设置文件类型过滤器。
运行结果如图:
其实 QFileDialog::getOpenFileName 函数声明是这样的:
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())
selectedFilter 用于存储用户选择的过滤器的名称,可以设置默认选择哪种过滤器。
options 用于指定对话框的选项。详见 QFileDialog::Options 枚举。
注意:getOpenFileName() 只能选择单一文件,要同时选择多个文件,则可以使用 getOpenFileNames() 函数。
消息对话框
消息对话框 QMessageBox 类提供了一个模态的对话框来通知用户一些信息,或者向用户提出一个问题并且获取答案。
// 提示对话框
int ret = QMessageBox::information(nullptr, QObject::tr("提示"), QObject::tr("这是一个提示对话框"), QMessageBox::Ok);
if (ret == QMessageBox::Ok)
qDebug() << QObject::tr("提示");
// 警告对话框
int ret2 = QMessageBox::warning(nullptr, QObject::tr("警告"), QObject::tr("这是一个警告对话框"), QMessageBox::Abort);
if (ret2 == QMessageBox::Abort)
qDebug() << QObject::tr("警告");
// 错误对话框
int ret3 = QMessageBox::critical(nullptr, QObject::tr("错误"), QObject::tr("这是一个错误对话框"), QMessageBox::YesAll);
if (ret3 == QMessageBox::YesAll)
qDebug() << QObject::tr("错误");
// 关于对话框
QMessageBox::about(nullptr, QObject::tr("关于"), QObject::tr("这里是bmseven的博客"));
// 提问对话框,带有Yes和No按钮
QMessageBox::StandardButton reply;
reply = QMessageBox::question(nullptr, QObject::tr("提问"), QObject::tr("你确定要执行此操作吗?"),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
qDebug() << QObject::tr("用户选择了Yes。");
} else {
qDebug() << QObject::tr("用户选择了No。");
}
运行结果如图:
这里创建了 5 个不同类型的消息对话框,分别拥有不同的图标和提示音(这个是操作系统设置的),几个参数分别用于设置父窗口、标题栏、显示信息和拥有的按钮。文章来源:https://www.toymoban.com/news/detail-666659.html
这里使用的都是 QMessageBox 类提供的标准按钮。返回值也都是 QMessageBox::StandardButton 枚举类型的值,唯独关于对话框 about() 函数没有返回值,因为它默认只有一个按钮。文章来源地址https://www.toymoban.com/news/detail-666659.html
到了这里,关于第三篇:对话框窗口部件 QDialog的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!