Qt对话框_模态/非模态

对话框在Qt GUI应用程序中有着广泛的用途,对话框有模态、非模态两种情况。

对于参数选择的对话框,一般用模态对话框;对于显示或查看某些内容的对话框,一般用非模态对话框。

对话框类QDialog,官方文档:http://qt-project.org/doc/qt-4.8/qdialog.html

1. 模态对话框

模态对话框通过调用exec()函数实现,使用模态对话框时,事件就在对话框内部循环,必须将对话框关闭才能继续执行主界面的操作。

需要注意的是,关闭模态对话框时,exec()将返回一个值。

原型:int QDialog::exec () [slot]

返回值利用:比如对话框中有Ok和Cancel两个按钮,点击Ok按钮时,关闭对话框同时主程序接受对话框中设置的参数,点击Cancel或右上角的X后,关闭对话框并且立即返回不再执行下面的程序。这种情况下,将Ok按钮的clicked()信号与accept()槽连接,Cancel按钮的clicked信号与reject()槽连接。这时,当点击Ok按钮式,将触发accept()槽,exec()返回QDialog::Recepted,当点击Cancel按钮时,将触发reject槽,exec()返回QDialog::Rejected。

connect(ui.Ok,SIGNAL(clicked()),this,SLOT(accept()));
connect(ui.Cancel,SIGNAL(clicked()),this,SLOT(reject()));

执行时,进行一下判断,点击了Cancel返回,点击了Ok传递对话框中的参数继续执行

1 //在某个函数中调用对话框
2 // a为对话框类对象
3 if(a.exec() == QDialog::Rejected)
4 {
5     //操作
6     return;
7 }
8 //传递对话框中的参数
9 //继续操作

不知道说明白了没有,不明白的话自己下代码实现一下。

2. 非模态对话框

非模态对话框调用show()函数实现,当然在主程序中,调用非模态对话框时,如果只写个show(),可能是对话框一闪而过,为了解决这个情况,需要全局对象的事件响应槽processEvents(),定时的访问该对话框,这样就可以处理主界面的事件同时对话框也不会消失。

本人采用方法时利用QTimer类的singleShot()方法。QTimer类提供了对时钟的操作。

QTimer类的官方文档:http://qt-project.org/doc/qt-4.8/qtimer.html

singleShot的原型:void QTimer::singleShot ( int msec, QObject * receiver, const char * member ) [static]

第一个参数为执行的时间间隔,单位为ms

第二个参数为接受的对象

第三个参数为触发的槽

恰好,我们可以每隔msec时间触发processEvents(),从而使对话框不消失,第二个参数为对话框对象。需要注意的是,对话框的对象要定义在堆上(即要定义成指针对象),因为如果定义在栈上,执行完后函数后对象会被自动清理掉,找不到第二个参数所需的对象,就没法显示出对话框了。

#include <QTimer>

CModallessDialog  *dialog;  //最好定义成全局变量

dialog = new CModallessDialog;
dialog->show();
dialog->setTitle(tr("非模态对话框")); //设置窗口标题
//对话框中的一些处理
QTimer::singleShot(200,dialog,SLOT(qApp->processEvents()));  //时间间隔200ms

在使用时,将dialog对象delete掉之后对话框就会消失

//如果对话框显示,就将其删除
if(NULL!=dialog)
{
    delete dialog
    dialog=NULL;
}

在显示对话框时,也要注意如果dialog!=NULLs时,现将其delete掉赋NULL再分配地址。

http://blog.csdn.net/mingxia_sui/article/details/8207871

时间: 2024-08-25 18:10:28

Qt对话框_模态/非模态的相关文章

第11章 对话框_11.2 非模态对话框

11.2.1 模态与非模态对话框的区别 区别 模态 非模态 默认风格 WS_POPUP|DS_MODALFRAME WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_VISIBLE 创建函数 DialogBox 创建后要等结束对话框后才返回. CreateDialog 创建后立即返回 可见性 默认是可见的 得指定WS_VISIBLE,否则创建完后得调用ShowWindow 消息处理 有自己的消息循环 消息进入程序的消息队列(处理见下面) 销毁对话框 EndDialog ①Des

关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)

对于模态非模态对话框默认是不响应菜单的UPDATE_COMMAND_UI消息的,需要增加对WM_INITMENUPOPUP消息的处理以后,才可以响应UPDATE_COMMAND_UI. [cpp] view plain copy void CXXXDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

QT模态对话框及非模态对话框

QT模态对话框及非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框

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

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

显示模态模态对话框和非模态对话框

模态对话框类和非模态对话框类的创建是一样的,也就是说当有一个对话框类(假设名称为CMyDialog),既可以用它来创建模态对话框实例并显示, 也可以用它来创建非模态对话框实例显示. 1.创建模态对话框实例并显示 CMyDialog   Dlg : Dlg.DoModal(): 也就是说只需要调用对话框类的DoModal()即可实现创建并显示模态对话框. 2.创建非模态对话框实例并显示 方法一:设使用CMyDialog类的CUser,定义和实现CUser的文件分别是 User.h和User.cpp

MFC中的模态对话框与非模态对话框

模态对话框创建: MyDialog mydlg; mydlg.DoModal() 当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行. 模态对话框的关闭顺序: OnClose:按关闭符号X后,响应WM_CLOSE消息 OnKillFocus:窗口即将失去输入焦点,响应WM_KILLFOCUS消息 OnDestroy:窗口即将被销毁时,响应WM_DESTROY消息 OnNcDestroy:窗口被销毁或,响应WM_NCDESTROY消息 PostNcDestroy:由

MFC模态对话框与非模态对话框的区别总结

非模态与模态对话框最主要的区别是非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互.但是打开模态对话框就必须关闭后才能进行在其它界面进行操作. 具体的区别有: 1.非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在栈上.通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象. 2.非模态对话框是通过调用CDialog::Create函数来启动,而模态对话框是通过调用C

VS2010/MFC对话框:非模态对话框的创建及显示

非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果. 非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 创建及显示非模态