C/C++ Qt Dialog 對話方塊元件應用

lyshark發表於2021-11-24

在Qt中對話方塊分為兩種形式,一種是標準對話方塊,另一種則是自定義對話方塊,在一般開發過程中標準對話方塊使用是最多的了,標準對話方塊一般包括 QMessageBox,QInputDialog,QFileDialog 這幾種,這裡我將總結本人在開發過程中常用到的標準對話方塊的使用技巧。

Qt框架下,常用的標準對話方塊有下面這幾種:

  • QMessageBox 提示資訊框
  • QInputDialog 基本輸入對話方塊(文字輸入,整數輸入,浮點數輸入,單選框輸入)
  • QFileDialog 檔案選擇對話方塊(選擇檔案,多選檔案,儲存檔案)

QMessageBox 訊息彈窗: 訊息對話方塊用於提示使用者,常見的有四種分別是:提示,警告,錯誤,確認,程式碼歸納如下所示。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

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

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

// By : LyShark
// https://www.cnblogs.com/lyshark
// 彈出各種MessageBox
void MainWindow::on_pushButton_clicked()
{
    QString dlgTitle="訊息框";
    QString strInfo="檔案已被修改,是否儲存修改 ?";

    QMessageBox::StandardButton defaultBtn = QMessageBox::NoButton; // 預設按鈕
    QMessageBox::StandardButton result;                             // 返回選擇的按鈕

    // 彈窗分類 Question information warning critical
    result=QMessageBox::question(this, dlgTitle, strInfo,QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,defaultBtn);

    if (result==QMessageBox::Yes)
        ui->plainTextEdit->appendPlainText("Question訊息框: Yes 被選擇");
    else if(result==QMessageBox::No)
        ui->plainTextEdit->appendPlainText("Question訊息框: No 被選擇");
    else if(result==QMessageBox::Cancel)
        ui->plainTextEdit->appendPlainText("Question訊息框: Cancel 被選擇");
    else
        ui->plainTextEdit->appendPlainText("Question訊息框: 無選擇");
}

// 彈出關於提示
void MainWindow::on_pushButton_2_clicked()
{
    QString dlgTitle="about 訊息框";
    QString strInfo="我開發的資料檢視軟體 V1.0 \n 保留所有版權";
    QMessageBox::about(this, dlgTitle, strInfo);
}

QMessageBox 退出事件: 彈窗元件還可以配合QCloseEvent實現事件通知機制,例如當窗體被關閉則提示使用者是否關閉窗體。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>
#include <QCloseEvent>

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

// 視窗關閉時詢問是否退出
void MainWindow::closeEvent(QCloseEvent *event)
{
   QMessageBox::StandardButton result=QMessageBox::question(this, "確認", "確定要退出本程式嗎?",
                      QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,
                      QMessageBox::No);

    if (result==QMessageBox::Yes)
        event->accept();
    else
        event->ignore();
}

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::~MainWindow()
{
    delete ui;
}

QInputDialog 對話方塊: 該對話方塊長用於輸入一段特殊的文字,浮點數,或者選擇一個列表框中的選項,該功能用於簡單的使用者互動場景。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QLineEdit>
#include <QInputDialog>

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

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

// 文字輸入對話方塊
void MainWindow::on_pushButton_clicked()
{
    QString dlgTitle="輸入文字對話方塊";
    QString txtLabel="請輸入檔名";
    QString defaultInput="新建檔案.txt";
    QLineEdit::EchoMode echoMode=QLineEdit::Normal;       // 正常文字輸入
    // QLineEdit::EchoMode echoMode=QLineEdit::Password;  // 密碼輸入

    bool flag = false;
    QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &flag);
    if (flag && !text.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(text);
    }
}

// 整數數值輸入對話方塊
// By : LyShark
// https://www.cnblogs.com/lyshark
void MainWindow::on_pushButton_2_clicked()
{
    QString dlgTitle="輸入整數對話方塊";
    QString txtLabel="設定字型大小";
    int defaultValue=ui->plainTextEdit->font().pointSize();   // 現有字型大小
    int minValue=6, maxValue=50, stepValue=1;                 // 範圍(步長)
    bool flag=false;
    int inputValue = QInputDialog::getInt(this, dlgTitle,txtLabel,defaultValue, minValue,maxValue,stepValue,&flag);
    if (flag)
    {
        QFont font=ui->plainTextEdit->font();
        font.setPointSize(inputValue);
        ui->plainTextEdit->setFont(font);
    }
}

// 浮點數輸入對話方塊
void MainWindow::on_pushButton_3_clicked()
{
    QString dlgTitle="輸入浮點數對話方塊";
    QString txtLabel="輸入一個浮點數";
    float defaultValue=3.13;

    float minValue=0, maxValue=10000;  // 範圍
    int decimals=2;                    // 小數點位數

    bool flag=false;
    float inputValue = QInputDialog::getDouble(this, dlgTitle,txtLabel,defaultValue, minValue,maxValue,decimals,&flag);
    if (flag)
    {
        QString str=QString::asprintf("輸入了一個浮點數:%.2f",inputValue);
        ui->plainTextEdit->appendPlainText(str);
    }
}

// 單選框條目選擇對話方塊
void MainWindow::on_pushButton_4_clicked()
{
    QStringList items;                        // 列表內容
    items <<"優秀"<<"良好"<<"合格"<<"不合格";    // 放入列表

    QString dlgTitle="條目選擇對話方塊";
    QString txtLabel="請選擇級別";
    int curIndex=0; //初始選擇項
    bool editable=false;                       // 是否可編輯
    bool flag=false;
    QString text = QInputDialog::getItem(this, dlgTitle,txtLabel,items,curIndex,editable,&flag);

    if (flag && !text.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(text);
    }
}

QFileDialog 對話方塊: 該對話方塊用於對文字的操作,例如開啟檔案,儲存檔案,選擇資料夾等,當點選選擇後,對話方塊會自動提取出檔案路徑。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFileDialog>

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

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

// 選擇單個檔案對話方塊
void MainWindow::on_pushButton_clicked()
{
    QString curPath=QDir::currentPath();                                       // 獲取系統當前目錄
//  QString  curPath=QCoreApplication::applicationDirPath();                   // 獲取應用程式的路徑
    QString dlgTitle="選擇一個檔案";                                             // 對話方塊標題
    QString filter="文字檔案(*.txt);;圖片檔案(*.jpg *.gif *.png);;所有檔案(*.*)";  // 檔案過濾器

    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);

    if (!aFileName.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(aFileName);
    }
}

// 選擇多個檔案對話方塊
// By : LyShark
// https://www.cnblogs.com/lyshark
void MainWindow::on_pushButton_2_clicked()
{
    // QString curPath=QCoreApplication::applicationDirPath();                // 獲取應用程式的路徑
    QString curPath=QDir::currentPath();                                      // 獲取系統當前目錄
    QString dlgTitle="選擇多個檔案";                                            // 對話方塊標題
    QString filter="文字檔案(*.txt);;圖片檔案(*.jpg *.gif *.png);;所有檔案(*.*)"; // 檔案過濾器

    QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
    for (int i=0; i<fileList.count();i++)
    {
        // 迴圈將檔案路徑新增到列表中
        ui->plainTextEdit->appendPlainText(fileList.at(i));
    }
}

// 選擇資料夾
void MainWindow::on_pushButton_3_clicked()
{
    QString curPath=QCoreApplication::applicationDirPath();    // 獲取應用程式的路徑
    // QString curPath=QDir::currentPath();                    // 獲取系統當前目錄

    // 呼叫開啟檔案對話方塊開啟一個檔案
    QString dlgTitle="選擇一個目錄";                             // 對話方塊標題
    QString selectedDir=QFileDialog::getExistingDirectory(this,dlgTitle,curPath,QFileDialog::ShowDirsOnly);
    if (!selectedDir.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(selectedDir);
    }
}

// 儲存檔案對話方塊
void MainWindow::on_pushButton_4_clicked()
{
    QString curPath=QCoreApplication::applicationDirPath();                  // 獲取應用程式的路徑
    QString dlgTitle="儲存檔案";                                              // 對話方塊標題
    QString filter="文字檔案(*.txt);;h檔案(*.h);;C++檔案(.cpp);;所有檔案(*.*)"; // 檔案過濾器
    QString aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
    if (!aFileName.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(aFileName);
    }
}

相關文章