第三篇:对话框窗口部件 QDialog

对话框窗口部件 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 个不同类型的消息对话框,分别拥有不同的图标和提示音(这个是操作系统设置的),几个参数分别用于设置父窗口、标题栏、显示信息和拥有的按钮。

这里使用的都是 QMessageBox 类提供的标准按钮。返回值也都是 QMessageBox::StandardButton 枚举类型的值,唯独关于对话框 about() 函数没有返回值,因为它默认只有一个按钮。

猜你喜欢

转载自blog.csdn.net/bmseven/article/details/132451123