Qt对话框的生命周期及模态设置

来源:互联网 发布:功夫英语 知乎 编辑:程序博客网 时间:2024/05/01 09:11

对话框的生命周期

QDialog dialog(this);

dialog.show();

这样在一个函数中定义的对象是建立在栈上的,函数执行完毕,dialog的显示就结束,显示的效果可能就是这个窗口一闪而逝。

QDialog *dialog = new QDialog(this);

dialog->show();

这样定义了一个指向QDialog对象的指针,用new开辟了新的内存空间,函数执行完毕,dialog还能够显示。此处我们可能会问,这样不会发生内存泄漏吗?

情况是这样,这里为dialog指明了父窗口,当父窗口关闭的时候,dialog随之被销毁。如果对内存占用有严格限制的话,当我们将主窗口作为 parent 时,主窗口不关闭,dialog就不会被销毁,所以会一直占用内存。在这种情景下,我们可以调用deleteLater()函数,或者是设置 dialog 的WindowAttribute

QDialog *dialog = new QDialog; 

 dialog->setAttribute(Qt::WA_DeleteOnClose); // 或者 dialog->deleteLater(); 

 dialog->setWindowTitle(tr("Hello, dialog!")); 

 dialog->show();

详细解释见博文:http://blog.csdn.net/zzwdkxx/article/details/25970677

 对话框模态的设置

调用exec()可以设置模态,如

QDialog *dialog = new QDialog(this); // 将this作为父窗

dialog->exec(); //只显示dialog,不显示父窗,只有当子窗口关闭,父窗口才显现

采用show显示的窗口,用setModal()同样可以设置模态

QDialog *dialog = new QDialog(this);

dialog->setModal(true);

dialog->show(); //子窗口显示的同时,父窗口也显示出来,只不过子窗口未关闭情况下无法对父窗口操作

与setModal()相似的一个函数setWindowModality()可以设置阻塞哪些窗口的显示,它有一个参数可以是Qt::NonModal(非模态)、Qt::WindowModal(模态,阻塞父窗口、祖先窗口及子窗口)、Qt::ApplicationModal(模态,阻塞整个应用程序所有窗口),默认状态下为最后一个。


关于Qt中new和delete的问题,还可参考:http://blog.csdn.net/dbzhang800/article/details/6300025

0 0