对话框的生命周期
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