模态与非模态

QDialog的显示有两个函数show()和exec()。他们的区别在参考文档上的解释如下:

1.show():
显示一个非模式对话框。控制权即刻返回给调用函数。
弹出窗口是否模式对话框,取决于modal属性的值。
(原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code. 
The dialog will be modal or modeless according to the value of the modal property. )

2.exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。
在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。
(原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result. 
Users cannot interact with any other window in the same application until they close the dialog. )

那么,以我的理解,模态的对话框就是在它没有被关闭之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目的时候弹出来的对话框就属于模态的。

而非模态的对话框不阻塞任何窗口。

示例代码(非模态):

#include "mainwindow.h"
#include <QApplication>
#include <QDialog>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

QDialog *dlg1=new QDialog();
    dlg1->show();

QDialog *dlg=new QDialog();
    dlg->setModal(true);
    dlg->exec();

return a.exec();
}

运行截图:

示例代码(模态):

#include "mainwindow.h"
#include <QApplication>
#include <QDialog>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

QDialog *dlg=new QDialog();
    dlg->setModal(true);
    dlg->exec();

QDialog *dlg1=new QDialog();
    dlg1->show();

return a.exec();
}

运行截图:

区别:

可以看到,两个示例程序中只是将模态与非模态的代码顺序调换了一下,就产生了不同的结果。

那么,结果就是在非模态程序中,两个窗口可以允许交替的交互;而在模态的程序中就不行,也即:要先关闭了模态的窗口后才可以弹出非模态的窗口。

tz

2017.4.7下午于hzau逸夫楼

时间: 2024-08-09 16:31:36

模态与非模态的相关文章

Qt 模态与非模态

模态是指当子窗口弹出时,焦点始终被强行集中于子窗口,只要子窗口不退出,焦点就不会被释放.非模态正好相反. 从线程角度讲,模态子窗口的线程是阻塞的,父.子窗口各有一个线程,当创建子窗口时,父线程就被子线程阻塞掉:非模态线程不是阻塞型的,父.子线程可以并行运行. 在Qt的模态中,主要用到QDialog的exec()方法: 1 2 3 4 5 6 7 8 9 10 SonDialog dlg(this); int res = dlg.exec(); if (res == QDialog::Accept

vc创建模态和非模态对话框

模态对话框的创建 创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能就是创建并显示一个模 态对话框,关闭模态对话框的函数是EndDialog,该函数需要一个参数,这个参数就是DoModal 函数的返回值. CTestDlg dlg;    dlg.DoModal();   //打开模态对话框 dlg.EndDialog(IDOK);//关闭模态对话框,相当于在模态对话框上点击了“确定”按钮 创建非模态对话框创建非模态对话框需要利用CDialog类的Create成员函数

模态和非模态的区别

模态和非模态的区别 模态窗口就是在该窗口关闭之前,其父窗口不可能成为活动窗口的那种窗口.举个例子:          窗口A弹出窗口B,如果窗口B是模态的,在窗口B关闭前就不可能切换到窗口A;如果B是非模态的,那可以在这两个窗口之间任意切换. 它一般用来显示提示信息和接受用户的输入.对话框不能独立存在.目前有两种对话框,分别为:模态对话框 和 非模态对话框.模态对话框在显示之后,就不能对同一个程序中的其它窗口进行操作.非模态对话框在显示之后,还可以对同一个程序的其它窗口进行操作.

MFC 模态、非模态窗口引发的系列事件及函数

标题一:创建模态窗口 CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg INT_PTR nResponse = dlg.DoModal();//获取子窗口的结束方式 switch(nResponse) { case IDOK: case IDCANCEL: case IDDESTROY: } 标题二:创建非模态子窗口(完美解决非模态窗口单例问题) 步骤一:创建子窗口指针类型的公有成员 public: CMyTip* m_mytip; 步骤二:父类通过按钮

模态与非模态对话框的问题

模式对话框(modal dialog box模态对话框):在关闭模式对话框之前,程序不能进行其他工作(如一般的"打开文件"对话框) 无模式对话框(modeless dialog box 非模态对话框):模式对话框打开后,程序仍然能够进行其他工作(如一般的"查找与替换"对话框) 模态和非模态对话框的具体介绍和区别 下面是我发现的一个问题: 我新建一个MFC工程在Dialog对话框(主窗口程序)上添加两个按钮,一个打开模态对话框,另一个打开非模态对话框. 1.如果我先打

Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good

在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结下. 模态QDialog 方式一: QDialog dlg(this);dlg.exec(); 方式二: QDialog *pDlg=new QDialog(this);pDlg->setModal(true);pDlg->show(); 非模态QDialog QDialog *pDlg=new

Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法

一.简述 先简单介绍一下模态与非模态对话框. 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭.这时一般需要点击对话框中的确定或者取消等按钮关闭该对话框,程序得到对话框的返回值(即点击了确定还是取消),并根据返回值进行相应的操作,之后将操作权返回给用户.这个时候用户可以点击或者拖动程序其他窗口. 说白了就相当于阻塞同一应用程序中其它可视窗口的输入的对话框,用户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应用

“模态”与“非模态”

模态与非模态,主要就是体现在是否“阻塞”应用程序上. 模态:在该窗口弹出后,会阻塞应用程序的窗口,使其不可操作: 非模态:不会阻塞应用程序的窗口,两者可独立操作. 模,就是模子,模子是不可更改的,因此模态情况下,除了它本身之外的内容不可操作. 两个的使用根据实际情况而定,转换的方式是通过 setModal() 函数. 值得注意的是,对于通过exec()函数show出来的应用程序,默认都是模态的,应该也无法更改,当然,一般情况下也不需要更改. 总结:模态与非模态的区别就是——是否阻塞应用程序. 原

MFC模态与非模态对话框

1.简述 1.1模态对话框(model dialog box) 当模态对话框显示时,程序会暂停执行,直到关闭这个模态对话框之后,才能执行程序中的其他任务. 1.2非模态对话框(modeless dialog box) 当非模态对话框显示时,运行转而执行程序中的其他任务,而不用关闭这个对话框. 2.代码 2.1模态对话框的实现 void CModelCtrDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 TestDialog1 dlg; dlg