首页 > 代码库 > Qt 模态与非模态

Qt 模态与非模态

模态是指当子窗口弹出时,焦点始终被强行集中于子窗口,只要子窗口不退出,焦点就不会被释放。非模态正好相反。

从线程角度讲,模态子窗口的线程是阻塞的,父、子窗口各有一个线程,当创建子窗口时,父线程就被子线程阻塞掉;非模态线程不是阻塞型的,父、子线程可以并行运行。

在Qt的模态中,主要用到QDialog的exec()方法:

 

1
2
3
4
5
6
7
8
9
10
SonDialog dlg(this);
int res = dlg.exec();
if (res == QDialog::Accepted)
{
    QMessageBox::information(this"INFORMATION""You clicked OK button!");
}
if (res == QDialog::Rejected)
{
    QMessageBox::information(this"INFORMATION""You clicked CANCEL button!");
}

 

通过exec()的返回值判断用户触发的是哪个按钮。

非模态,主要用到了QDialog中的show()方法:

 

1
2
3
SonDialog *dlg;
dlg = new SonDialog(this);
dlg->show();

 

转自:http://blog.csdn.net/zhy282289/article/details/6741356

  http://www.cnblogs.com/weiweiqiao99/archive/2011/05/19/2050887.html

 

先记录一下模态和非模态的关系:

1.QDialog 和QWidget都可以模态和非模态.

                 exec(), show()

                 是否是模态和上两个函数无关,只和窗口属性有关

                 setAttribute(Qt::WA_ShowModal, true)或setWindowModality(Qt::ApplicationModal);修改其是否为模态.

                 对于QDialog还可以用他成员函数setModal(true)(dlg->show模态);

                 exec()之所以是模态是因为他先设置了窗口属性:setAttribute()再show()的(具体看源码)

 

2.一个QWIDGET是窗体还是窗体上的控件和是否有父类无关,只与窗口标记有关:setWindowFlags(Qt::Window)

                QPushButton * pPushBtn = new QPushButton(this);

                QPushButton * pPushBtn = new QPushButton(当没有父类时,构造函数就会加上Qt::Window标记)

                QDialog * dlg = new QDialog(this);不管有无父类都为窗体,因为向QWIDGET传参数时传递了Qt::Dialog标记.

                所以使变成窗体只用setWindowFlags(Qt::Window);

 

Qt 模态与非模态