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

时间: 2024-12-23 20:21:49

Qt 模态与非模态的相关文章

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()方法

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

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

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

模态和非模态的区别

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

模态与非模态

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

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.如果我先打

“模态”与“非模态”

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

Qt对话框——模态和非模态

1. 定义一个 QDialog 对象 : QDialog dialog(this)如果是在函数中定义的变量,函数执行完自动释放 dialog.show() 一闪而过  ------->非模态 如果改为    dialog.exec(); ------>模态对话框,mywidget类对象窗口除非关闭这个对话框才会弹出来 定义了个指向QDialog类对象的指针变量 QDialog * dialog = new QDialog(this):dialog->show()   ------->