QT--弹出新的对话框 show()/exec()的区别
show()显示非模态对话框,exec()显示模态对话框。
非模态对话框不会阻塞程序的线程,因此
如果你的对话框时创建在栈上,跳出作用域之后,对象便销毁了,对话框会一闪而过;
如果使用new在堆上创建对话框,跳出作用域之后对象不能被销毁,但是建立在堆上需要考虑释放内存的问题;
非模态对话框不会阻塞线程,可能用户还没来得及输入数据,就已经执行之后的代码。
模态对话框开启一个事件循环,会阻塞程序的线程,函数返回之后,直接获取对话框的数据。
新建一个项目,主界面如下:
非模态窗口打开代码如下:
1 #ifndef NEWMODALDIALOG_H 2 #define NEWMODALDIALOG_H 3 4 #include <QDialog> 5 6 namespace Ui { 7 class newModalDialog; 8 } 9 10 class newModalDialog : public QDialog 11 { 12 Q_OBJECT 13 14 public: 15 explicit newModalDialog(QWidget *parent = 0); 16 ~newModalDialog(); 17 18 signals: 19 void receiveData(QString s); 20 private: 21 Ui::newModalDialog *ui; 22 void accept(); 23 }; 24 25 #endif // NEWMODALDIALOG_H
1 #include "newmodaldialog.h" 2 #include "ui_newmodaldialog.h" 3 4 newModalDialog::newModalDialog(QWidget *parent) : 5 QDialog(parent), 6 ui(new Ui::newModalDialog) 7 { 8 ui->setupUi(this); 9 } 10 11 newModalDialog::~newModalDialog() 12 { 13 delete ui; 14 } 15 16 void newModalDialog::accept() 17 { 18 QString data = ui->lineEdit_showText->text(); 19 emit receiveData(data); //emit发送信号 20 QDialog::accept(); 21 }
1 void MainWindow::on_pushButton_modelessDlg_clicked() 2 { 3 newModalDialog *newDlg = new newModalDialog(); 4 connect(newDlg,&newModalDialog::receiveData,this,&MainWindow::displayData); 5 newDlg->show(); 6 7 } 8 9 void MainWindow::displayData(const QString& data) 10 { 11 ui->label_getInput->setText(data); 12 }
模态窗口打开主要代码如下:
1 #ifndef NEWDIALOG_H 2 #define NEWDIALOG_H 3 4 ///模态对话框 5 6 #include <QDialog> 7 8 namespace Ui { 9 class newDialog; 10 } 11 12 class newDialog : public QDialog 13 { 14 Q_OBJECT 15 16 public: 17 explicit newDialog(QWidget *parent = 0); 18 ~newDialog(); 19 20 QString getinput(); //获取输入的数据 21 private: 22 Ui::newDialog *ui; 23 }; 24 25 #endif // NEWDIALOG_H
1 #include "newdialog.h" 2 #include "ui_newdialog.h" 3 4 newDialog::newDialog(QWidget *parent) : 5 QDialog(parent), 6 ui(new Ui::newDialog) 7 { 8 ui->setupUi(this); 9 } 10 11 newDialog::~newDialog() 12 { 13 delete ui; 14 } 15 16 QString newDialog::getinput() 17 { 18 return ui->lineEdit_input->text(); 19 }
1 void MainWindow::on_pushButton_showNewDialog_clicked() 2 { 3 newDialog newDlg; 4 newDlg.exec(); 5 ui->label_getInput->setText(newDlg.getinput()); 6 }
参考:https://blog.csdn.net/knightaoko/article/details/53825314