天天看點

#《Qt學習之路》學習之路(4)#對話框->标準消息對話框(QMessageBox)

2018.5.29

每周接近997的工作強度實在是壓力太大,靜下心來整理整理東西。暑假打算挖出曾經做的一些東西來發些文章,希望老闆能夠同意。

網上大概翻了一些教程,對比一下發現Qt學習之路2的學習推進方式更适合我一些,為了防止自己遺忘,在這裡分享一些學習的要點,我記的知識要點可能偏個人一些,大機率思維會比較跳躍,建議參考部落客原文和檢視官方API了解。

對話框(QDialog):

Qt 中使用QDialog類實作對話框。如果 parent 為 NULL,則該對話框會作為一個頂層視窗,在工作列會有自己的位置;否則則作為其父元件的子對話框(此時,其預設出現的位置是 parent 的中心),共享其父元件的位置。

通過QDialog dialog;可以使對話框出現在任意位置

通過QDialog dialog(this);可以使對話框出現在視窗正中

通過QDialog *dialog = new QDialog;建在堆上,不會因為show()一閃而過

使用QDialog::open()/exec()實作視窗級别的模态對話框(阻塞其他視窗輸入),使用QDialog::show()實作非模态對話框。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QStatusBar>
#include <QToolBar>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setWindowTitle(tr("Main Window"));

    openAction = new QAction(QIcon(":/images/doc-open"), tr("&open..."), this);
    openAction->setShortcuts(QKeySequence::Open);
    openAction->setStatusTip(tr("Open an existing file"));
    connect(openAction, &QAction::triggered, this, &MainWindow::open);

    QMenu *file = menuBar() -> addMenu(tr("&File"));
    file->addAction(openAction);

    QToolBar *toolBar = addToolBar(tr("&File"));
    toolBar->addAction(openAction);
}

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

void MainWindow::open(){
    //出現在任意位置
    //QDialog dialog;
    //出現在視窗正中
    QDialog dialog(this);
    //建在堆上,不會因為show()一閃而過,下方.改為->
    //若用show()一閃而過原因:show()函數不會阻塞目前線程,對話框會顯示出來,然後函數立即傳回,代碼繼續執行。
    //dialog 是建立在棧上的,show()函數傳回,MainWindow::open()函數結束,dialog 超出作用域被析構,是以對話框消失了。
    //QDialog *dialog = new QDialog;
    //dialog->setAttribute(Qt::WA_DeleteOnClose);

    dialog.setWindowTitle(tr("Hello,dialog!"));
    //使用QDialog::open()/exec()實作視窗級别的模态對話框(阻塞其他視窗輸入),使用QDialog::show()實作非模态對話框。
    dialog.exec();
    //dialog.show();

    //qDebug()類似于std::cout或者 Java 的System.out.println();語句,将後面的資訊輸出到标準輸出,一般就是控制台輸出。
    //由于exec()函數沒有傳回,是以下面的result()函數也就不會被執行。直到對話框關閉,exec()函數傳回,此時,我們就可以取得對話框的資料。
    qDebug() << dialog.result();
    /*
    判斷使用者點了确定或者取消
    QDialog dialog(this);
    if (dialog.exec() == QDialog::Accepted) {
    // do something
    } else {
    // do something else
    }
    */
}
           

運作效果:

#《Qt學習之路》學習之路(4)#對話框-&gt;标準消息對話框(QMessageBox)

由于是模态對話框,在不關閉對話框之前主界面無法移動和操作。

exec()函數的真正含義是開啟一個新的事件循環。Qt 在開啟了事件循環之後,系統發出的各種事件才能夠被程式監聽到。這個事件循環相當于一種輪詢的作用。既然是無限循環,當然在開啟了事件循環的地方,代碼就會被阻塞,後面的語句也就不會被執行到。

QDialog::exec()是有傳回值的,其傳回值是QDialog::Accepted或者QDialog::Rejected。對于使用了exec()顯示的模态對話框,我們可以在exec()函數之後直接從對話框的對象擷取到資料值。

标準消息對話框(QMessageBox):

标準對話框主要指QT内置的常用對話框,标準對話框大緻分為以下幾類:

QColorDialog:選擇顔色;

QFileDialog:選擇檔案或者目錄;

QFontDialog:選擇字型;

QInputDialog:允許使用者輸入一個值,并将其值傳回;

QMessageBox:模态對話框,用于顯示資訊、詢問問題等;

QPageSetupDialog:為列印機提供紙張相關的選項;

QPrintDialog:列印機配置;

QPrintPreviewDialog:列印預覽;

QProgressDialog:顯示操作過程。

其中,QMessageBox為标準消息對話框,用于顯示消息提示。

#include "mainwindow.h"
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
#include <QObject>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QMessageBox msgBox;
    msgBox.setText("The document has been modified.");
    msgBox.setInformativeText("Do you want to save your changes");
    //會自動生成一個show details按鈕,根據平台不同出現在按鈕中的不同位置。
    msgBox.setDetailedText("Differences here...");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);

    int ret = msgBox.exec();
    switch (ret) {
    case QMessageBox::Save:
        qDebug() << "Save document";
        break;
    case QMessageBox::Discard:
        qDebug() << "Discard changes";
        break;
    case QMessageBox::Cancel:
        qDebug() << "Close document";
        break;
    }


    return a.exec();
}
           

運作效果:

#《Qt學習之路》學習之路(4)#對話框-&gt;标準消息對話框(QMessageBox)