Qt 5種標准對話框及使用方法詳解(Dialog)


引用自:  http://c.biancheng.net/view/1870.html(侵刪);
QT為應用程序設計提供了一些常用的標准對話框,如打開文件對話框、選擇顏色對話框、信息提示和確認選擇對話框、標准輸入對話框等,用戶無需再自己設計這些常用的對話框,這樣可以減少程序設計工作量。

在前面幾章的實例中,或多或少地用到了其中的一些對話框。Qt 預定義的各標准對話框的類,及其主要靜態函數的功能見表 1(由於輸入參數一般較多,省略了函數的輸入參數,只列出了函數的返回值類型)。

表 1 Qt預定義標准對話框
對話框 常用靜態函數名稱 函數功能
QFileDialog
文件對話框
QString getOpenFileName() QStringList getOpenFileNames() QString getSaveFileName() QString getExistingDirectory() QUrl getOpenFileUrl() 選擇打開一個文件 選擇打開多個文件 選擇保存一個文件 選擇一個己有的目錄
選擇打幵一個文件,可選擇遠程網絡文件
QcolorDialog
顏色對話框
QColor getColor() 選擇顏色
QFontDialog
字體對話框
QFont getFont() 選擇字體
QinputDialog
輸入對話框
QString getText() int getlnt() double getDouble()
QString getltem()
QString getMultiLineText()
輸入單行文字 輸入整數 輸入浮點數
從一個下拉列表框中選擇輸入 輸入多行字符串
QMessageBox
消息框
StandardButton information() StandardButton question() StandardButton waming() StandardButton critical() void about() void aboutQt() 信息提示對話框 詢問並獲取是否確認的對話框 警告信息提示對話框 錯誤信息提示對話框 設置自定義信息的關於對話框 關於Qt的對話框

實例 samp6_1 演示使用這些對話框,程序運行界面如圖 2 所示。下方的文本框顯示打開文件的文件名或一些提示信息,某些對話框的輸入結果可應用於文本框的屬性設置,如字體和顏色。



圖 2 實例 samp6_1 運行界面

QFileDialog 對話框

選擇打開一個文件

若要打開一個文件,可調用靜態函數 QFileDialog::getOpenFileName(),“打開一個文件”按鈕的響應代碼如下:
void Dialog::on_btnOpen_clicked()
{ //選擇單個文件
    QString curPath=QDir::currentPath();//獲取系統當前目錄
    //獲取應用程序的路徑
    QString dlgTitle="選擇一個文件"; //對話框標題
    QString filter="文本文件(*.txt);;圖片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件過濾器
    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    if (!aFileName.isEmpty())
        ui->plainTextEdit->appendPlainText(aFileName);
}
QFileDialog::getOpenFileName() 函數需要傳遞 3 個字符串型參數,分別如下:
  1. 對話框標題,這里設置為"選擇一個文件"。
  2. 初始化目錄,打開對話框時的初始目錄,這里用QDinxurrentPath()獲取應用程序當前目錄。
  3. 文件過濾器,設置選擇不同后綴的文件,可以設置多組文件,如:

QString f ilter="文本文件.txt);;圖片文件(* .jpg *.gif *.png);;所有文件(*.*)";

每組文件之間用兩個分號隔開,同一組內不同后綴之間用空格隔開。

QFileDialog::getOpenFileName() 函數返回的是選擇文件的帶路徑的完整文件名,如果在對話框里取消選擇,則返回字符串為空。

選擇打開多個文件

若要選擇打開多個文件,可使用靜態函數 QFileDialog::getOpenFileNames(),“打開多個文件”按鈕的響應代碼如下:
void Dialog::on_btnOpenMulti_clicked()
{ //選擇多個文件
    //獲取應用程序的路徑
    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));
}
getOpenFileNames() 函數的傳遞參數與 getOpenFileName() —樣,只是返回值是一個字符串列表,列表的每一行是選擇的一個文件。

選擇已有目錄

選擇己有目錄可調用靜態函數 QFileDialog::getExistingDirectory(),同樣,若需要傳遞對話框標題和初始路徑,還應傳遞一個選項,一般用 QFileDialog::ShowDirsOnly,表示對話框中只顯示目錄。

靜態函數 QCoreApplication::applicationDirPath() 返回應用程序可執行文件所在的目錄,getExistingDirectory() 函數的返回值是選擇的目錄名稱字符串。

選擇保存文件名

選擇一個保存文件,使用靜態函數 QFileDialog::getSaveFileName(),傳遞的參數與 getOpenFileName() 函數相同。只是在調用 getSaveFileName() 函數時,若選擇的是一個己經存在的文件,會提示是否覆蓋原有的文件。如果提示覆蓋,會返回為選擇的文件,但是並不會對文件進行實質操作,對文件的刪除操作需要在選擇文件之后自己編碼實現。

如下面的代碼,即使選擇覆蓋文件,由於代碼里沒有實質地覆蓋原來的文件,也不會對選擇的文件造成任何影響:
void Dialog::on_btnSave_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);
}

QColorDialog 對話框

QColorDialog 是選擇顏色對話框,選擇顏色使用靜態函數 QColorDialog::getColor()。下面是“選擇顏色”按鈕的代碼,它為文本框的字體選擇顏色。
void Dialog::on_btnColor_clicked()
{
    QPalette pal=ui->plainTextEdit->palette(); //獲取現有 palette
    QColor  iniColor=pal.color(QPalette::Text); //現有的文字顏色
    QColor color=QColorDialog::getColor(iniColor,this,"選擇顏色");
    if (color.isValid()) //選擇有效
    {
        pal.setColor(QPalette::Text,color); //palette 設置選擇的顏色
        ui->plainTextEdit->setPalette(pal); //設置 palette
    }
}
getColor() 函數需要傳遞一個初始的顏色,這里是將palette提取的文本顏色作為初始顏色。getColor() 函數返回一個顏色變量,若在顏色對話框里取消選擇,則返回的顏色值無效,通過 QColor::isValid() 函數來判斷返回是否有效。

QFontDialog 對話框

QFontDialog 是選擇字體對話框,選擇字體使用靜態函數 QFontDialog::getFont()。下面是“選擇字體”按鈕的代碼,它為文本框選擇字體,字體設置的內容包括字體名稱、大小、粗體、斜體等。
void Dialog::on_btnFont_clicked()
{//選擇字體
    QFont iniFont=ui->plainTextEdit->font(); //獲取文本框的字體
    bool   ok=false;
    QFont font=QFontDialog::getFont(&ok,iniFont); //選擇字體
    if (ok) //選擇有效
        ui->plainTextEdit->setFont(font);
}
gctFont() 返回一個字體變量,但是 QFont 沒有類似於 isValid() 的函數來判斷有效性,所以在調用 getFont() 函數時以引用方式傳遞一個邏輯變量 ok,調用后通過判斷 ok 是否為 true 來判斷字體選擇是否有效。

QInputDialog標准輸入對話框

QInputDialog 有單行字符串輸入、整數輸入、浮點數輸入、列表框選擇輸入和多行文本等多種輸入方式,圖 3 是其中 4 種界面效果。
 


圖 3 QinputDialog 4種輸入對話框

輸入文字

QInputDialog::getText() 函數顯示一個對話框用於輸入字符串,傳遞的參數包括對話框標題、提示標簽文字、缺省輸入、編輯框響應模式等。

其中編輯框響應模式是枚舉類型 QLineEdit::EchoMode,它控制編輯框上文字的顯示方式,正常情況下選擇 QLineEdit::Normal;如果是輸入密碼,選擇 QLineEdit::Password。代碼如下:
void Dialog::on_btnInputString_clicked()
{ //輸入字符串
    QString dlgTitle="輸入文字對話框";
    QString txtLabel="請輸入文件名";
    QString defaultInput="新建文件.txt";
    QLineEdit::EchoMode echoMode=QLineEdit::Normal;//正常文字輸入
    //QLineEdit::EchoMode echoMode=QLineEdit::Password;//密碼輸入
    bool ok=false;
    QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &ok);
    if (ok && !text.isEmpty())
        ui->plainTextEdit->appendPlainText(text);
}

輸入整數

使用 QInputDialog::getInt() 函數輸入一個整數,下面的代碼為文本選擇字體大小:
void Dialog::on_btnInputInt_clicked()
{//輸入整數
    QString dlgTitle="輸入整數對話框";
    QString txtLabel="設置字體大小";
    int defaultValue=ui->plainTextEdit->font().pointSize(); //現有字體大小
    int minValue=6, maxValue=50,stepValue=1; //范圍,步長
    bool ok=false;
    int inputValue = QInputDialog::getInt(this, dlgTitle,txtLabel,
                               defaultValue, minValue,maxValue,stepValue,&ok);
    if (ok) //是否確認輸入
    {
        QFont   font=ui->plainTextEdit->font();
        font.setPointSize(inputValue);
        ui->plainTextEdit->setFont(font);
    }
}
輸入整數對話框使用一個 SpinBox 組件輸入整數,getInt() 需要傳遞的參數包括數值大小范圍、步長、初始值,確認選擇輸入后,將輸入的整數值作為文本框字體的大小。

輸入浮點數

使用 QInputDialog::getDouble() 函數輸入一個浮點數,輸入對話框使用一個 QDoubleSpinBox 作為輸入組件,getDouble() 的輸入參數需要輸入范圍、初始值、小數點位數等。代碼如下:
void Dialog::on_btnInputFloat_clicked()
{ //輸入浮點數
    QString dlgTitle="輸入浮點數對話框";
    QString txtLabel="輸入一個浮點數";
    float defaultValue=3.13;

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

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

下拉列表選擇輸入

使用 QInputDialog::getItem() 可以從一個 ComboBox 組件的下拉列表中選擇輸入。代碼如下:
void Dialog::on_btnInputItem_clicked()
{ //條目選擇輸入
    QStringList items; //ComboBox 列表的內容
    items <<"優秀"<<"良好"<<"合格"<<"不合格";

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

    if (ok && !text.isEmpty())
        ui->plainTextEdit->appendPlainText(text);
}
getItem() 函數需要一個 QStringList 變量為其 ComboBox 組件做條目初始化,curIndex 指明初始選擇項,editable 表示對話框里的ComboBox是否可編輯,若不能編輯,則只能在下拉列表中選擇。

QMessageBox 消息對話框

簡單信息提示

消息對話框 QMessageBox 用於顯示提示、警告、錯誤等信息,或進行確認選擇,由幾個靜態函數實現這些功能(詳見表 1)。其中 warning()、information()、critical() 和 about() 這幾個函數的輸入參數和使用方法相同,只是信息提示的圖標有區別。

例如,warning() 的函數原型是:

StandardButton QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)

其中,parent 是對話框的父窗口,指定父窗口之后,打開對話框時,對話框將自動顯示在父窗口的上方中間位置;title 是對話框標題字符串;text 是對話框需要顯7K的信息字符串;buttons 是對話框提供的按鈕,缺省只有一個 OK 按鈕;defaultButton 是缺省選擇的按鈕,缺省表示沒有選擇。

warning() 函數的返回結果是 StandardButton 類型。對話框上顯示的按鈕和缺省選中按鈕也是 StandardButton 類型。

StandardButton 是各種按鈕的定義,如 OK、Yes、No、Cancel 等,其枚舉取值是 QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Close 等。

詳見 Qt 幫助文檔中的StandardButton 類型的說明。

對於 warning()、information()、critical() 和 about() 這幾種對話框,它們一般只有一個 OK 按鈕,且無須關心對話框的返回值。所以,使用缺省的按鈕設置即可。



圖 4 QMessageBox 的幾種消息提示對話框

例如,下面是程序中調用 QMessageBox 信息顯示的代碼(顯示的幾個對話框如圖 4 所示):
void Dialog::on_btnMsgInformation_clicked()
{
    QString dlgTitle="information消息框";
    QString strInfo="文件已經打開,字體大小已設置";
   QMessageBox::information(this, dlgTitle, strInfo,
                              QMessageBox::Ok,QMessageBox::NoButton);
}

void Dialog::on_btnMsgWarning_clicked()
{
    QString dlgTitle="warning 消息框";
    QString strInfo="文件內容已經被修改";

    QMessageBox::warning(this, dlgTitle, strInfo);
}

void Dialog::on_btnMsgCritical_clicked()
{
    QString dlgTitle="critical消息框";
    QString strInfo="有不明程序訪問網絡";
    QMessageBox::critical(this, dlgTitle, strInfo);
}

void Dialog::on_btnMsgAbout_clicked()
{
    QString dlgTitle="about消息框";
    QString strInfo="我開發的數據查看軟件 V1.0 \n 保留所有版權";
    QMessageBox::about(this, dlgTitle, strInfo);
}

確認選擇對話框

QMessageBox::question() 函數用於打開一個選擇對話框,提示信息,並提供 Yes、No、OK、Cancel 等按鈕,用戶單擊某個按鈕返回選擇,如常見的文件保存確認對話框如圖 5 所示。

 
 


圖 5 QMessageBox:: question() 生成的對話框

靜態函數 QMessageBox::question() 的原型如下:

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

question() 對話框的關鍵是在其中可以選擇顯示多個按鈕,例如同時顯示 Yes、No、OK 或 Cancel() 其返回結果也是一個 StandardButton 類型變量,表示哪個按鈕被單擊了。

下面是產生如圖 5 所示對話框的代碼,並根據對話框選擇結果進行了判斷和顯示:
void Dialog::on_btnMsgQuestion_clicked()
{
    QString dlgTitle="Question消息框";
    QString strInfo="文件已被修改,是否保存修改?";

    QMessageBox::StandardButton  defaultBtn=QMessageBox::NoButton; //缺省按鈕

    QMessageBox::StandardButton result;//返回選擇的按鈕
    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消息框: 無選擇");
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM