返回顶部

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
非模态窗口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 }
非模态窗口cpp文件

 

 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
模态对话框窗口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 }
模态对话框窗口cpp文件

 

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

 

posted @ 2020-04-09 18:14  Zoya23  阅读(1080)  评论(0编辑  收藏  举报