Qt::ApplicationModal不起作用的原因

设置QWidget的Qt::WindowModality属性为Qt::WindowModal和Qt::ApplicationModal,发现窗体仍然不会模态,最后问题解决掉了,是因为我的QWidget有Parent,如果构造时设置Parent为NULL的话,就可以了。代码如下:

ver_frame = new versionFrame();
ver_frame->setWindowFlags(Qt::FramelessWindowHint);//去除窗体边框
ver_frame->setWindowModality(Qt::ApplicationModal);//设置窗体模态,要求该窗体没有父类,否则无效
ver_frame->setGeometry(178, 178, 284, 132);
ver_frame->show()

对话框的生命周期

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();


对话框模态的设置

调用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(模态,阻塞整个应用程序所有窗口),默认状态下为最后一个。


猜你喜欢

转载自blog.csdn.net/qq_33485434/article/details/80518907
今日推荐