Qt 非模态对话框exec()与模态对话框show()

2019-07-13 07:11发布

下面两段话摘自:《基于嵌入式Linux的Qt图形程序实战开发》P41~42
用一句来表示我对exec()的理解吧:首先会显示对话框,然后会阻塞后面的代码的执行,直到对话框关闭,返回结果。
模式对话框:所谓模式对话框就是说,该对话框会把该应用程序的其他窗口的输入锁定,其他应用程序仍然可以被用户访问。也就是说当一个模式对话框运行时,该应用程序的其他窗口就不能进行操作了。想要恢复对其他对话框的操作必须先处理该模式对话框。因此模式对话框常用于需要用户输入文件名的地方,比如保存文件时。通常情况下,模式对话框运行时调用它的exec()函数。
非模式对话框:所谓非模式对话框其实就是和模式对话框相对应的,在该对话框运行后,仍然可以对该应用程序中的其他窗口进行操作。对于一个非模式的对话框,它的运行通常调用show()函数。
http://blog.csdn.net/goforwardtostep/article/details/53667566
void Dialog::slotAddRow() { // int num = tableWidget->rowCount(); // tableWidget->insertRow(num); //下面的代码重要*** int num = tableWidget->rowCount();//得到表格中有多少行 Info *info = new Info(); info->exec(); QString name = info->nametext; tableWidget->insertRow(num); tableWidget->setItem(num,0,new QTableWidgetItem(name)); } 模式对话框有自己的事件循环。按照我的理解,实际上 exec() 方法是先设置modal属性为Qt::ApplicationModal,然后调用 show() 显示对话框,最后启用事件循环来阻止exec() 方法的结束直到窗口关闭,得到返回结果(DialogCode),退出事件循环最后exec()方法调用结束,exec()方法后的代码将继续执行
tableWidget->insertRow(num); tableWidget->setItem(num,0,new QTableWidgetItem(name));
而show()函数是非模式对话框,调用后不等对话框关闭马上执行后面的代码。(如果调用了show(),还没等到对话框关闭,就执行了后面的代码,所以就不能添加到tablewidget里