下面来说说模态对话框。什么是模态对话框?所谓模态,就是在对话框弹出来之后,能够阻塞后面的窗口。Windows 上一般在退出时会弹出来一个问你是否保存的对话框,就是一个模态对话框。当它出现的时候,后面的窗口是不能点击的,必须要你关闭这个对话框之后才可以。在 Qt 实现模态对话框很简单:
MyQDialogSubclass dialog; if (dialog.exec() == QDialog::Accept) { }
这段代码在运行时,会在标记 HERE 注释这行阻塞,具体是 QDialog::exec() 这个函数。这之后的代码在你关闭 dialog 对话框之后才会被执行。利用这一技术,你就可以在 if 里面获取依赖于对话框返回值的数据。例如,对话框用于收集用户数据等。
class MyDialog : public QDialog { public : QString name; }; MyDialog d; if (d.exec() == QDialog::Accept) { QString name = d.name; }
上面的代码,MyDialog 用于用户输入 name 的值。我们使用模态对话框,就可以在 if 里面获取这个值了。
不过,不同平台上的模态对话框的使用方式是不一样的。比如,Windows 平台上,模态对话框用于严重错误的提示,或者是在继续之前必须完成的任务;KDE 上,模态对话框用于可能造成数据丢失或者严重后果的交互。
Qt 中,对话框的打开具有三种方式:
QDialog::show(): 非模态 QDialog::exec(): 模态 QDialog::open(): 窗口模态
前两种我们很容易理解,下面来看看什么是窗口模态。比如,我们有两个窗口(以下图示来自 Qt Developer Day, 2009):
使用如下代码,我们用 open() 函数打开一个对话框:
if (!messageBox) { messageBox = new QMessageBox( "SDI" , "The document has been modified. \n" "Do you want to save your changes?" , QMessageBox::Warning, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape, this ); connect(messageBox, SIGNAL(finished(int )), SLOT(handleDialogClose( int ))); } messageBox->open();
看看运行的结果:
这就是 open() 函数的效果:它类似模态对话框,但是只会阻塞一个窗口,而不是将整个系统阻塞掉。
FROM: http://devbean.blog.51cto.com/448512/491509/