Qt模态和非模态对话框

本文详细介绍了Qt中模态对话框和非模态对话框的创建方式,包括QMessageBox的使用和exec()与show()方法的不同。讨论了模态对话框的阻塞性质和非模态对话框的交互特性,并提到了如何避免内存泄漏的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 模态对话框

Qt 中使用QMessageBox类实现对话框。我们的对话框通常继承自QDialog。对话框分为模态对话框和非模态对话框。所谓模态对话框,就是会阻塞同一应用程序中其它窗口的输入。Qt使用QDialog::exec()来实现模态对话框。如下所示:

QMessageBox msgBox(QMessageBox::Information, "提示", "模态对话框");
QTimer::singleShot(2000, &msgBox, SLOT(close()));
msgBox.exec();

如果不关闭QMessageBox 窗口,那么就无法执行下面的代码,这就是模态对话框。

二. 非模态对话框

非模态对话框就是在打开它的时候,我们仍旧能够操作其它的窗口。Qt使用QDialog::show()来创建非模态对话框。

QMessageBox *msg= new QMessageBox ;
msg->setText("非模态对话框");
msg->show();
dialog->setAttribute(Qt::WA_DeleteOnClose);        //在关闭窗口的时候释放内存
QTimer::singleShot(2000, msg, SLOT(close()));

非模态对话框,如果我们创建在栈上,那么它会一闪而过(除非它是全局的或者静态的)。因此我们将它创建在堆上,
即使这样我们也不能去释放它,否则他也是一闪而过。那么随着每次操作都会有内存泄漏。为了避免这一点,
Qt提供了一个setAttribute函数来设置可以在关闭它的时候释放内存。