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