天天看點

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

一、概述

本文用一個例子講述Qt幾種基本對話框的使用,包括QDialog、QFileDialog、QColorDialog、QFontDialog、QInputDialog、QMessageBox這幾種。中間還會講到如何實作ui的互相調用、中文顯示問題等。 

源碼下載下傳:

Qt基本對話框

二、功能描述

先來看一下我們要實作哪些功能:

1、在主對話框中包含 QFileDialog、QColorDialog、QFontDialog、QInputDialog、QMessageBox 五種對話框的啟動按鈕。

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

2、點選“标準檔案對話框”,彈出QFileDialog,右側的QLineEdit中顯示檔案名;

3、點選“标準顔色對話框”,彈出QColorDialog,右側QFrame中顯示選擇的顔色;

4、點選“标準字型對話框”,彈出QFontDialog,右側文字改變字型;

5、點選“标準輸入對話框”,彈出新的QDialog,在子對話框中點選“修改”彈出QInputDialog,可以輸入和更改資訊;

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

6、點選“标準資訊對話框”,彈出新的QDialog,在自對話框中點選不同的消息對話框彈出不同種類的QMessageBox。

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

三、功能實作

本例依然采用ui+code的方法來實作上述功能。

根據上面的功能說明,除了主Dialog外,還需添加input和message的2個額外二級子對話框供主對話框調用。

工程目錄如下:

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

1、标準檔案對話框

右鍵按鈕,添加槽函數

void basedialog::on_fileButton_clicked()
{
    QString filename = QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("打開檔案"),"C:/");
    ui->filelineEdit->setText(filename);
}
           

這裡我們隻是通過getOpenFileName()函數擷取檔案名,F2查到其函數原型為:

static QString getOpenFileName(QWidget *parent = Q_NULLPTR,
                                   const QString &caption = QString(),
                                   const QString &dir = QString(),
                                   const QString &filter = QString(),
                                   QString *selectedFilter = Q_NULLPTR,
                                   Options options = Options());
           

F1查詢使用文檔有用法示例:

QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                  "/home",
                                                  tr("Images (*.png *.xpm *.jpg)"));
           

關于中文顯示的問題:

這裡說明一下,由于我的Qt使用了VS2015作為編譯器,VS2015内部編碼根據使用區域預設為GBK,而Qt預設采用UTF-8編碼,是以在Qt Creator的代碼中的中文顯示胡出現亂碼,而.ui檔案使用XML,是以在.ui中編輯的中文均能正常顯示。修改中文亂碼的方法網上有很多,但我測試後最快捷有效的是這個方法:Qt技巧——中文顯示亂碼問題。

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結
Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

2、标準顔色對話框

同樣,直接添加槽函數:

void basedialog::on_colorButton_clicked()
{
    QColor color = QColorDialog::getColor(Qt::yellow,this,QString::fromLocal8Bit("選擇顔色"),QColorDialog::ShowAlphaChannel);
    ui->colorframe->setPalette(QPalette(color));
    ui->colorframe->setAutoFillBackground(true);
}
           

這裡顯示顔色用的是QFrame,QFrame是widget的一個基類,可以友善地改變外形,這裡用它來擷取顔色接收參數并将背景色更改為對應顔色。

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結
Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

3、标準字型對話框

用法與上面相同,查詢文檔和函數原型便可知道用法。

void basedialog::on_fontButton_clicked()
{
    bool ok;
    QFont font = QFontDialog::getFont(&ok,QFont("Arial",12),this,QString::fromLocal8Bit("字型"));
    if(ok)
        ui->fontlineEdit->setFont(font);
}
           

4、标準輸入對話框

這裡需要在目前的對話框調用另一個對話框。方法可以參考前面的:Qt技巧——多視窗調用

進入子對話框inputdialog後,我們可以嘗試進行多種類型的輸入操作:

字元串、字元串多選清單、整數、double浮點數。以字元串輸入為例,先建立一個輸入對話框的執行個體,用getText()方法擷取輸入框的字元串,傳給變量newname,并用label顯示newname。

void InputDialog::on_nameButton_clicked()
{
    bool ok;
    nameInputDialog = new QInputDialog;
    QString newname = nameInputDialog->getText(this,
                                               QString::fromLocal8Bit("修改姓名"),
                                               QString::fromLocal8Bit("名姓:"),
                                               QLineEdit::Normal,
                                               ui->namelabel2->text(),
                                               &ok);
    if(ok && !newname.isEmpty()){
        ui->namelabel2->setText(newname);
    }
}
           

至于getText()各參數的含義,可以F1查詢文檔,官方給出了詳細用法說明和示例。

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

其他輸入的操作類似,隻需重載資料擷取的方法即可:

void InputDialog::on_nameButton_clicked()
{
    bool ok;
    nameInputDialog = new QInputDialog;
    QString newname = nameInputDialog->getText(this,
                                               QString::fromLocal8Bit("修改姓名"),
                                               QString::fromLocal8Bit("名姓:"),
                                               QLineEdit::Normal,
                                               ui->namelabel2->text(),
                                               &ok);
    if(ok && !newname.isEmpty()){
        ui->namelabel2->setText(newname);
    }
}

void InputDialog::on_sexButton_clicked()
{
    bool ok;
    QStringList SexItems;
    SexItems<<QString::fromLocal8Bit("男")<<QString::fromLocal8Bit("女");
    sexInputDialog = new QInputDialog;
    QString SexItem = sexInputDialog->getItem(this,
                                              QString::fromLocal8Bit("修改性别"),
                                              QString::fromLocal8Bit("性别:"),
                                              SexItems,0,false,
                                              &ok);
    if(ok && !SexItem.isEmpty()){
        ui->sexlabel2->setText(SexItem);
    }
}

void InputDialog::on_ageButton_clicked()
{
    bool ok;
    ageInputDialog = new QInputDialog;
    int newage = ageInputDialog->getInt(this,
                                        QString::fromLocal8Bit("修改年齡"),
                                        QString::fromLocal8Bit("年齡:"),
                                        22,-2147483647,2147483647,1,
                                        &ok);
    if(ok){
        ui->agelabel2->setText(QString("%1").arg(newage));
    }
}

void InputDialog::on_scoreButton_clicked()
{
    bool ok;
    scoreInputDialog = new QInputDialog;
    double newscore = scoreInputDialog->getDouble(this,
                                                  QString::fromLocal8Bit("修改分數"),
                                                  QString::fromLocal8Bit("分數:"),
                                                  0,-2147483647,2147483647,1,
                                                  &ok);
    if(ok){
        ui->scorelabel2->setText(QString("%1").arg(newscore));
    }
}
           

5、标準消息對話框

與标準輸入對話框一樣,需要建立一個子對話框。在标準消息對話框中,我們給出了5種對話框示例:question、information、warning、critical、about。

以question為例,我們調用了QMessageBox::question(),函數原型為:

StandardButton QMessageBox::question(QWidget *parent, 
           
const QString &title, 
           
const QString &text, 
           
StandardButtons buttons = StandardButtons( Yes | No ), 
           
StandardButton defaultButton = NoButton)
           

最後兩項分别設定對話框中的按鈕及預設已選按鈕,我這裡隻給了Ok和Cancel兩個按鈕,預設選擇Ok。然後用一個Switch分别對Ok和Cancel進行處理。我這裡是将其與一個Label綁定,點選不同按鈕顯示不同字元串。

void MsgDialog::on_qstMsgButton_clicked()
{
    QMessageBox::StandardButton msgindex = QMessageBox::question(this,
                          QString::fromLocal8Bit("詢問"),
                          QString::fromLocal8Bit("修改完成,是否繼續?"),
                          QMessageBox::Ok|QMessageBox::Cancel,
                          QMessageBox::Ok);
    switch (msgindex) {
    case QMessageBox::Ok:
        ui->msgLabel->setText("question msg:ok");
        break;
    case QMessageBox::Cancel:
        ui->msgLabel->setText("question msg:cancel");
        break;
    default:
        break;
    }
}
           
Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

同樣的,我們用類似方法設定其他對話框:

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結

四、總結

Qt中基本标準對話框的使用相對來說還是很簡便的,大量現成的類和方法都可以直接拿來用,并且幫助文檔中已經給了詳細的說明和用例。最後上一張整體的圖吧:

Qt學習09——基本标準對話框一、概述二、功能描述三、功能實作四、總結