对话框概述:
对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的 功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序 最上层,用于实现短期任务或者简洁的用户交互。
Qt中对话框实现使用的是 QDialog 类。就像主窗口一样,我们通常会设计一个类继 承 QDialog。
关于QDialog(及其子类,以及所有 Qt::Dialog 类型的类)其 parent 指针:
如果 parent 为 NULL,则该对话框会作为一个顶 层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位 置,而非顶层窗口则会共享其父组件的位置。
模态对话框和非模态对话框
模态对话框:
就是会阻塞同一应用程序中其它窗口的输入。 模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开 文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分 进行操作的。
非模态对话框:
例如查找对话框,我们可以在显示着查找对话 框的同时,继续对记事本的内容进行编辑,并不会阻塞应用程序对其他窗口的输入
1,标准对话框
所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多 对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有 程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。
Qt 的内置对话框大致分为以下几类
QColorDialog: 选择颜色;
QFileDialog: 选择文件或者目录;
QFontDialog: 选择字体;
QInputDialog: 允许用户输入一个值,并将其值返回;
QMessageBox: 模态对话框,用于显示信息、询问问题等;
QPageSetupDialog: 为打印机提供纸张相关的选项;
QPrintDialog: 打印机配置;
QPrintPreviewDialog:打印预览;
QProgressDialog: 显示操作过程。
2,自定义模态对话框
在Qt中有两种模态对话框:应用程序级别和窗口级别
应用程序级别的模态:
当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
窗口级别的模态:
该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式。
使用exec()
函数实现应用程序级别模态对话框
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle("模态对话框");
dialog->setAttribute(Qt::WA_DeleteOnClose);//设置关闭对话框自动释放
dialog->exec();
setAttribute()
函数设置对话框关闭时,自动销毁对话框。
注:也可以使用open函数实现窗口级别的模态对话框
3,自定义非模态对话框
使用 QDialog::show()
实现非模态对话框
QDialog *dialog2 = new QDialog(this);
dialog2->setWindowTitle("非模态对话框");
dialog2->setAttribute(Qt::WA_DeleteOnClose);//设置关闭对话框自动释放
dialog2->show();
setAttribute()
函数设置对话框关闭时,自动销毁对话框。
需要注意的是,我们在实现非模态对话框的时候如果不是在堆上开辟空间,而是定义了临时变量,这个对话框就会一闪而过,因为在函数执行完成后是自动直接释放变量
如下:
QDialog dialog2 ;
dialog2.setWindowTitle("非模态对话框");
dialog2.show();
所以在实现非模态对话框的时候注意变量的存活周期。
4,消息对话框
QMessageBox
用于显示消息提示。我们一般会使用其提供的几个 static 函数:
1>显示关于对话框
void about(QWidget * parent, const QString & title, const QString & text)
/*参数说明*/
/*1,指定父窗口
2,指定文本标题
3,关于文本*/
/*显示关于 Qt 对话框。该对话框用于显示有关 Qt 的信息。*/
void aboutQt(QWidget * parent, const QString & title = QString());
如下:
QMessageBox::about(this,"关于对话框","关于提示");
注:关于对话框是一个模态对话框
2>严重错误对话框
/*显示严重的错误对话框*/
StandardButton critical(QWidget * parent, const QString & title,const QString & text, StandardButtons buttons = Ok,StandardButton defaultButton = NoButton);
/*参数说明*/
/*
1,父窗口
2,标题
3,文本内容
4,选择的按键(Ok或者Yes等)默认情况下只有一个 Ok 按钮, 我们可以使用StandardButtons 类型指定多种按钮。
*/
如下:
QMessageBox::critical(this,"错误对话框","错误提示",QMessageBox::Cancel);
3>其他对话框
信息对话框
提供一个普通的信息图标
StandardButton information(QWidget * parent, const QString & title,
const QString & text, StandardButtons buttons = Ok,
StandardButton defaultButton = NoButton)
问题对话框用来进性选择的最后可以获取选择结果进行判断
StandardButton question(QWidget * parent, const QString & title,
const QString & text,
StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
如下:
QMessageBox::StandardButton ret = QMessageBox::question(this,"问题对话框","提示",QMessageBox::Ok|QMessageBox::No);
if(ret == QMessageBox::Ok)
{
/*选择了Ok*/
}else if(ret == QMessageBox::No)
{
/*现在了No*/
}
执行结果
警告对话框
黄色的警告图标
StandardButton warning(QWidget * parent, const QString & title,
const QString & text, StandardButtons buttons = Ok,
StandardButton defaultButton = NoButton)
在使用QMessageBox的时候虽然方便,但是有时候我们需要一些别的属性,现在就需要调用它的属性API来实现
一个简单询问保存文件例子
/*定义变量*/
QMessageBox msgBox;
/*设置文本*/
msgBox.setText(tr("文件已经被修改"));
/*设置详细文本*/
msgBox.setInformativeText(tr("保存文件?"));
/*设置详细信息, 添加一显示详情按钮*/
msgBox.setDetailedText(tr("显示详情>>>>>"));
/*设置选择的按钮*/
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
/*默认按钮*/
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret)
{
case QMessageBox::Save:
qDebug() << "Save document!"; break;
case QMessageBox::Discard:
qDebug() << "Discard changes!"; break;
case QMessageBox::Cancel:
qDebug() << "Close document!"; break;
}