对话框分类:对话框分模态对话框和非模态对话框,模态和非模态对话框对应的都是QDialog类
模态对话框
模态对话框是阻塞对话框,模态对话框打开时,会阻塞进程,除了模态对话框外,其他对话框无法选中也无法操作。
非模态对话框
非模态对话框是非阻塞对话框,非模态对话框打开时不影响进程,可以选中或者在其他对话框编辑,非模态对话框本身也可以移动。
打开模态对话框
要想打开模态对话框,只需要调用QDialog类的exec()方法。
int main() { QDialog dlg; dlg.exec(); //启用模态对话框 }
打开非模态对话框
要想打开模态对话框,只需要调用QDialog类的show()方法。
int main() { QDialog dlg; dlg.show(); //启用非模态对话框 }
但是对于非模态对话框,上面的代码是有问题的,对话框会一闪而过,原因是非模态对话框是非阻塞的,而对象又是创建在栈区, 所以执行完show()方法后对话框对象就直接析构了,解决办法,将对话框创建在堆区。
int main() { QDialog* dlg = new QDialog; dlg->show(); //启用非模态对话框 }
如果有以下的一段代码,非模态对话框是通过点击按钮后在堆区创建的,那么只要主窗口不关闭,非模态对话框就不会析构,这块内存会一直存在,并且另外又创建了新的内存块,这样最终会导致内存泄漏。
示例
class MyWindow: public QMainWindow { public: MyWindow(); public slots: void createDialog(); public: QPushbutton btn; }; MyWindow::MyWindow() { connect(&btn, &QPushbutton::clicked, this, &MyWindow::createDialog); } void MyWindow::createDialog() { QDialog* dlg = new QDialog; dlg->show(); //函数执行完后,内存被保留下来,没有其他地方来释放这块内存 }
为了解决上述问题,QT提供了一个属性,通过设置属性就可以在对话框关闭时自动析构。
示例
class MyWindow: public QMainWindow { public: MyWindow(); public slots: void createDialog(); public: QPushbutton btn; }; MyWindow::MyWindow() { connect(&btn, &QPushbutton::clicked, this, &MyWindow::createDialog); } void MyWindow::createDialog() { QDialog* dlg = new QDialog; dlg->setAttribute(Qt::WA_DeleteOnClose); //设置关闭后析构的属性,设置该属性后,当用户点击对话框的关闭按钮,对话框对象将自动析构 dlg->show(); }
浙公网安备 33010602011771号