一文详解QDialog中exec与open的区别

1. 两者区别的现象

注意:需要看下方的打印信息

-1

2. 部分代码解释

2.1 open显示对话框

2.1.1 对象方式创建

  1. QDialog dia;
  2. dia.resize(400, 300);
  3. dia.open();
  4. qDebug() << “111”;

使用对象的方式实现一个对话框的显示,并使用open进行显示,即按钮Btn1实现的窗口,可以清晰的看到:对话框窗口是一闪而过的,但不影响open之后的代码的运行,其“111”还是会打印出来。

为什么一闪而过?

此时的对象dia是局部对象,局部对象存储在栈中,在函数体中被构造,在函数结束的时候被析构。其生命周期为整个函数。也就是说在函数结束的时候,其对象dia已经被析构掉了,所以窗口没了。

2.1.2 指针方式创建

  1. QDialog* pDia = new QDialog(this);
  2. pDia->resize(400, 300);
  3. pDia->open();
  4. qDebug() << “222”;

使用指针的方式实现对话框,使用open进行显示,即按钮Btn2实现的窗口,可以看到:对话框是模态的,但不影响open之后的代码的运行,即“222”的打印。
指针的话就不会出现一闪而过的情况,因为存储在堆里,需要手动释放。

2.2 exec显示对话框

  1. //指针方式
  2. QDialog* pDia = new QDialog(this);
  3. pDia->resize(400, 300);
  4. pDia->exec();
  5. qDebug() << “333”;
  1. //对象方式
  2. QDialog dia;
  3. dia.resize(400, 300);
  4. dia.exec();
  5. qDebug() << “333”;

使用exec进行显示,即按钮Btn3实现的窗口,可以看到:对话框是模态的,并且在对话框显示之后,其后面的代码并不会执行,即“333”并不会打印,也就是说exec显示的窗口会一直阻塞后面的代码不会执行,直到用户关闭它之后,才会执行后面的代码,此时”333“会打印出来。

无论使用对象或者指针的方式实现对话框,其后面的代码并不会执行,会一直阻塞在那里。

若是对象的话,exec会阻塞,导致不会执行完整个函数,那么对象就不会析构掉。

3. exec与open的区别

open:显示模态窗口,会继续执行open之后的代码

exec:显示模态窗口,会一直阻塞,exec后面的代码会阻塞不会执行,直到用户关闭它,才会执行后面的代码

4. 全部代码示例

4.1 MainWindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QDebug>
  5. #include <QDialog>
  6. #include <QHBoxLayout>
  7. #include <QMainWindow>
  8. #include <QPushButton>
  9.  
  10. namespace Ui {
  11.      class MainWindow;
  12. }
  13.  
  14. class MainWindow : public QMainWindow {
  15.      Q_OBJECT
  16.  
  17. public:
  18.      explicit MainWindow(QWidget* parent = 0);
  19.      ~MainWindow();
  20.  
  21. private slots:
  22.      void slotShowDia1();
  23.      void slotShowDia2();
  24.      void slotShowDia3();
  25.  
  26. private:
  27.      Ui::MainWindow* ui;
  28.  
  29.      QPushButton* m_pBtn1;
  30.      QPushButton* m_pBtn2;
  31.      QPushButton* m_pBtn3;
  32. };
  33.  
  34. #endif // MAINWINDOW_H

4.2 MainWindow.cpp

  1. #include “mainwindow.h”
  2.  
  3. #include “ui_mainwindow.h”
  4. MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
  5.      ui->setupUi(this);
  6.      this->resize(800, 600);
  7.  
  8.      QPushButton* m_pBtn1 = new QPushButton(QStringLiteral(“Btn1”), this);
  9.      QPushButton* m_pBtn2 = new QPushButton(QStringLiteral(“Btn2”), this);
  10.      QPushButton* m_pBtn3 = new QPushButton(QStringLiteral(“Btn3”), this);
  11.  
  12.      QWidget* widget = this->centralWidget();
  13.      QHBoxLayout* lay = new QHBoxLayout(widget);
  14.      lay->addwidget(m_pBtn1);
  15.      lay->addWidget(m_pBtn2);
  16.      lay->addWidget(m_pBtn3);
  17.  
  18.      connect(m_pBtn1, &QPushButton::clicked, this, &MainWindow::slotShowDia1);
  19.      connect(m_pBtn2, &QPushButton::clicked, this, &MainWindow::slotShowDia2);
  20.      connect(m_pBtn3, &QPushButton::clicked, this, &MainWindow::slotShowDia3);
  21. }
  22.  
  23. MainWindow::~MainWindow() { delete ui; }
  24.  
  25. void MainWindow::slotShowDia1() {
  26.      QDialog dia;
  27.      dia.resize(400, 300);
  28.      dia.open();
  29.      qDebug() << “111”;
  30. }
  31.  
  32. void MainWindow::slotShowDia2() {
  33.      QDialog* pDia = new QDialog(this);
  34.      pDia->resize(400, 300);
  35.      pDia->open();
  36.      qDebug() << “222”;
  37. }
  38.  
  39. void MainWindow::slotShowDia3() {
  40.      //指针方式
  41.      QDialog* pDia = new QDialog(this);
  42.      pDia->resize(400, 300);
  43.      pDia->exec();
  44.      qDebug() << “333”;
  45.      //对象方式
  46.      //QDialog dia;
  47.      //dia.resize(400, 300);
  48.      //dia.exec();
  49.      //qDebug() << “333”;
  50. }

到此这篇关于一文详解QDialog中exec与open的区别的文章就介绍到这了,更多相关QDialog exec open内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

标签

发表评论