qt 模态对话框可以互相调用吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 模态对话框可以互相调用吗相关的知识,希望对你有一定的参考价值。

1、模态对话框
(1)要想使一个对话框成为模态对话框,只需要条用它的exec()函数。
QDialog dialog(this);
dialog.exec();
(2)show()函数建立模态对话框,调用函数setModal(true)函数即可。
QDialog *dialog = new QDialog(this);
dialog->setModel(true);
dialog->show();

总结:setModel()与用exec()函数时的效果是不一样的,调用show()函数后会立刻把控制权交给调用者,程序可以继续往下执行;
而调用exec()函数,只有当对话框关闭时才会有返回值。

2、非模态对话框
(1)要想使一个对话框成为非模态对话框,使用new动态创建。
QDialog *dialog = new QDialog(this);
dialog->show();

setWindowModality()函数,有一个参数设置模态对话框要阻塞的窗口类型,可以是Qt::NonModal(不阻塞任何窗口,几非模态)、
Qt::WindowModel(阻塞它的父窗口和所有的祖先窗口及他们的子窗口)、Qt::ApplicationModel(阻塞整个应用程序的窗口)三者之一,
setModel()函数默认的是Qt::ApplicationModel.
参考技术A 对话框本身就是一个对象比如说QLabel和QWidget,要实现窗口互相调用肯定是可行的

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 msecQObject * 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

以上是关于qt 模态对话框可以互相调用吗的主要内容,如果未能解决你的问题,请参考以下文章

QT之两种模态对话框的调用

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

Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)

Qt 销毁模态对话框

QT笔记之模态对话框及非模态对话框

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