返回值利用:比如对话框中有Ok和Cancel两个按钮,点击Ok按钮时,关闭对话框同时主程序接受对话框中设置的参数,点击Cancel或右上角的X后,关闭对话框并且立即返回不再执行下面的程序。这种情况下,将Ok按钮的clicked()信号与accept()槽连接,Cancel按钮的clicked信号与reject()槽连接。这时,当点击Ok按钮式,将触发accept()槽,exec()返回QDialog::Aecepted,当点击Cancel按钮时,将触发reject槽,exec()返回QDialog::Rejected。
connect(ui.Ok,SIGNAL(clicked()),this,SLOT(accept()));//在某个函数中调用对话框 // a为对话框类对象 if(a.exec() == QDialog::Rejected) { //操作 return; } //传递对话框中的参数 //继续操作
不知道说明白了没有,不明白的话自己下代码实现一下。
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
//如果对话框显示,就将其删除 if(NULL!=dialog) { delete dialog dialog=NULL; }在显示对话框时,也要注意如果dialog!=NULLs时,现将其delete掉赋NULL再分配地址。
原文:
http://www.cnblogs.com/Romi/archive/2012/04/16/2452644.html