-
对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。
-
自己设计的对话框类继承自QDialog类,如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。
顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。
-
分类
-
模态对话框:会阻塞同一应用程序中其他窗口的输入
-
应用程序级别的模态(default):用户必须首先与该对话框交互,直到对话框关闭,才能访问程序中的其他窗口。
-
窗口级别的模态:仅阻塞与对话框关联的窗口,允许用户与程序中的其他窗口交互。
-
-
非模态对话框
-
使用QDialog::exec()实现应用程序级别的模态对话框; 使用QDialog::open()实现窗口级别的模态对话框; 使用QDialog::show()实现非模态对话框
//传入的parent是null(没有传入),所以该窗口是顶层窗口
void MainWindow::open()
{
QDialog dialog;
dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.exec();//应用程序级模态对话框
}
//传入的parent是mainwindow的指针,所以该窗口属于mainwindow
void MainWindow::open()
{
QDialog dialog(this);
dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.open();//窗口级别的模态对话框
}
//非模态对话框
void MainWindow::open()
{
QDialog dialog(this);
dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.show();
}
上述非模态对话框一闪而过???因为show()函数不会阻塞当前线程,对话框会显示出来, 但是函数立刻返回,而dialog建立在栈区,show()函数返回,dialog被释放掉,因此对话框消失。
解决办法就是:将dialog建立在堆区
void MainWindow::open()
{
QDialog *dialog = new QDialog;
dialog->setWindowTitle(tr("Hello, dialog!"));
dialog->show();
}
窗口new出来之后没释放掉会一直占用内存,使用dialog的setAttribute()函数,设置对话框关闭时,自动销毁对话框。
void MainWindow::open()
{
QDialog *dialog = new QDialog;
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setWindowTitle(tr("Hello, dialog!"));
dialog->show();
}
-
Qt的内置对话框大致分为以下几类:
-
QColorDialog
:选择颜色; -
QFileDialog:选择文件或者目录;
-
QFontDialog
:选择字体; -
QInputDialog
:允许用户输入一个值,并将其值返回; -
QMessageBox:模态对话框,用于显示信息、询问问题等;
-
QPageSetupDialog
:为打印机提供纸张相关的选项; -
QPrintDialog
:打印机配置; -
QPrintPreviewDialog
:打印预览; -
QProgressDialog
:显示操作过程。