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
}
*/
}
運作效果:

由于是模态對話框,在不關閉對話框之前主界面無法移動和操作。
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();
}
運作效果: