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

来源:互联网 发布:华为硬件单片机笔试题 编辑:程序博客网 时间:2024/05/17 04:47

下面两段话摘自:《基于嵌入式Linux的Qt图形程序实战开发》P41~42


模式对话框:所谓模式对话框就是说,该对话框会把该应用程序的其他窗口的输入锁定,其他应用程序仍然可以被用户访问。也就是说当一个模式对话框运行时,该应用程序的其他窗口就不能进行操作了。想要恢复对其他对话框的操作必须先处理该模式对话框。因此模式对话框常用于需要用户输入文件名的地方,比如保存文件时。通常情况下,模式对话框运行时调用它的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里