欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解QDialog中exec與open的區(qū)別

 更新時間:2023年03月29日 15:20:21   作者:半醒半醉日復日,花落花開年復年  
這篇文章主要為大家詳細介紹了QDialog中exec與open的區(qū)別,文中的示例代碼講解詳細,對我們學習Qt有一定的幫助,需要的可以參考一下

1. 兩者區(qū)別的現(xiàn)象

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

2. 部分代碼解釋

2.1 open顯示對話框

2.1.1 對象方式創(chuàng)建

QDialog dia;
dia.resize(400, 300);
dia.open();
qDebug() << "111";

使用對象的方式實現(xiàn)一個對話框的顯示,并使用open進行顯示,即按鈕Btn1實現(xiàn)的窗口,可以清晰的看到:對話框窗口是一閃而過的,但不影響open之后的代碼的運行,其“111”還是會打印出來。

為什么一閃而過?

此時的對象dia是局部對象,局部對象存儲在棧中,在函數(shù)體中被構(gòu)造,在函數(shù)結(jié)束的時候被析構(gòu)。其生命周期為整個函數(shù)。也就是說在函數(shù)結(jié)束的時候,其對象dia已經(jīng)被析構(gòu)掉了,所以窗口沒了。

2.1.2 指針方式創(chuàng)建

QDialog* pDia = new QDialog(this);
pDia->resize(400, 300);
pDia->open();
qDebug() << "222";

使用指針的方式實現(xiàn)對話框,使用open進行顯示,即按鈕Btn2實現(xiàn)的窗口,可以看到:對話框是模態(tài)的,但不影響open之后的代碼的運行,即“222”的打印。
指針的話就不會出現(xiàn)一閃而過的情況,因為存儲在堆里,需要手動釋放。

2.2 exec顯示對話框

//指針方式
QDialog* pDia = new QDialog(this);
pDia->resize(400, 300);
pDia->exec();
qDebug() << "333";
//對象方式
QDialog dia;
dia.resize(400, 300);
dia.exec();
qDebug() << "333";

使用exec進行顯示,即按鈕Btn3實現(xiàn)的窗口,可以看到:對話框是模態(tài)的,并且在對話框顯示之后,其后面的代碼并不會執(zhí)行,即“333”并不會打印,也就是說exec顯示的窗口會一直阻塞后面的代碼不會執(zhí)行,直到用戶關(guān)閉它之后,才會執(zhí)行后面的代碼,此時”333“會打印出來。

無論使用對象或者指針的方式實現(xiàn)對話框,其后面的代碼并不會執(zhí)行,會一直阻塞在那里。

若是對象的話,exec會阻塞,導致不會執(zhí)行完整個函數(shù),那么對象就不會析構(gòu)掉。

3. exec與open的區(qū)別

open:顯示模態(tài)窗口,會繼續(xù)執(zhí)行open之后的代碼

exec:顯示模態(tài)窗口,會一直阻塞,exec后面的代碼會阻塞不會執(zhí)行,直到用戶關(guān)閉它,才會執(zhí)行后面的代碼

4. 全部代碼示例

4.1 MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDebug>
#include <QDialog>
#include <QHBoxLayout>
#include <QMainWindow>
#include <QPushButton>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget* parent = 0);
    ~MainWindow();

private slots:
    void slotShowDia1();
    void slotShowDia2();
    void slotShowDia3();

private:
    Ui::MainWindow* ui;

    QPushButton* m_pBtn1;
    QPushButton* m_pBtn2;
    QPushButton* m_pBtn3;
};

#endif  // MAINWINDOW_H

4.2 MainWindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
    this->resize(800, 600);

    QPushButton* m_pBtn1 = new QPushButton(QStringLiteral("Btn1"), this);
    QPushButton* m_pBtn2 = new QPushButton(QStringLiteral("Btn2"), this);
    QPushButton* m_pBtn3 = new QPushButton(QStringLiteral("Btn3"), this);

    QWidget* widget = this->centralWidget();
    QHBoxLayout* lay = new QHBoxLayout(widget);
    lay->addWidget(m_pBtn1);
    lay->addWidget(m_pBtn2);
    lay->addWidget(m_pBtn3);

    connect(m_pBtn1, &QPushButton::clicked, this, &MainWindow::slotShowDia1);
    connect(m_pBtn2, &QPushButton::clicked, this, &MainWindow::slotShowDia2);
    connect(m_pBtn3, &QPushButton::clicked, this, &MainWindow::slotShowDia3);
}

MainWindow::~MainWindow() { delete ui; }

void MainWindow::slotShowDia1() {
    QDialog dia;
    dia.resize(400, 300);
    dia.open();
    qDebug() << "111";
}

void MainWindow::slotShowDia2() {
    QDialog* pDia = new QDialog(this);
    pDia->resize(400, 300);
    pDia->open();
    qDebug() << "222";
}

void MainWindow::slotShowDia3() {
	//指針方式
    QDialog* pDia = new QDialog(this);
    pDia->resize(400, 300);
    pDia->exec();
    qDebug() << "333";
    
	//對象方式
	//QDialog dia;
	//dia.resize(400, 300);
	//dia.exec();
	//qDebug() << "333";
}

到此這篇關(guān)于一文詳解QDialog中exec與open的區(qū)別的文章就介紹到這了,更多相關(guān)QDialog exec open內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)LeetCode(87.攪亂字符串)

    C++實現(xiàn)LeetCode(87.攪亂字符串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(87.攪亂字符串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談C++標準庫

    淺談C++標準庫

    C++標準庫是一組C++模板類,提供了通用的編程數(shù)據(jù)結(jié)構(gòu)和函數(shù),本文簡單講解C++標準庫包含的一些內(nèi)容,可能會對小伙伴的學習或工作有一定的幫助,大家一起來看看吧
    2021-08-08
  • C++ 讀寫文件安全又簡潔的簡單實例

    C++ 讀寫文件安全又簡潔的簡單實例

    這篇文章主要介紹了C++ 讀寫文件安全又簡潔的簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++ QT智能指針的使用詳解

    C++ QT智能指針的使用詳解

    這篇文章主要介紹了C++ QT智能指針的使用,Qt是一個跨平臺的C++框架,主要用來開發(fā)圖形用戶界面程序,也可以開發(fā)不帶界面的命令行程序,下面我們來了解QT智能指針是如何使用的
    2023-12-12
  • 淺談C語言之字符串處理函數(shù)

    淺談C語言之字符串處理函數(shù)

    下面小編就為大家?guī)硪黄獪\談C語言之字符串處理函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • C語言結(jié)構(gòu)體超詳細講解

    C語言結(jié)構(gòu)體超詳細講解

    C語言結(jié)構(gòu)體(Struct)從本質(zhì)上講是一種自定義的數(shù)據(jù)類型,只不過這種數(shù)據(jù)類型比較復雜,是由?int、char、float?等基本類型組成的。你可以認為結(jié)構(gòu)體是一種聚合類型
    2022-04-04
  • C語言實現(xiàn)倒置字符串的兩種方法分享

    C語言實現(xiàn)倒置字符串的兩種方法分享

    這篇文章主要和大家詳細介紹了利用C語言實現(xiàn)倒置字符串的兩種方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
    2022-08-08
  • C++實現(xiàn)LeetCode(158.用Read4來讀取N個字符之二 - 多次調(diào)用)

    C++實現(xiàn)LeetCode(158.用Read4來讀取N個字符之二 - 多次調(diào)用)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(158.用Read4來讀取N個字符之二 - 多次調(diào)用),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++詳細講解圖論的基礎與圖的儲存

    C++詳細講解圖論的基礎與圖的儲存

    圖論〔Graph?Theory〕是數(shù)學的一個分支。它以圖為研究對象。圖論中的圖是由若干給定的點及連接兩點的線所構(gòu)成的圖形,這種圖形通常用來描述某些事物之間的某種特定關(guān)系,用點代表事物,用連接兩點的線表示相應兩個事物間具有這種關(guān)系
    2022-05-05
  • VS2019配置opencv詳細圖文教程和測試代碼的實現(xiàn)

    VS2019配置opencv詳細圖文教程和測試代碼的實現(xiàn)

    這篇文章主要介紹了VS2019配置opencv詳細圖文教程和測試代碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04

最新評論