Qt對話框之一:標准對話框


Qt 提供了一些常用的對話框類型,全部繼承自 QDialog 類,並增加了自己的特色功能,比如獲取顏色、顯示特定信息等。


一、顏色對話框

顏色對話框類 QColorDialog 提供了一個可以獲取指定顏色的對話框部件。

/***    第一種方式     ***/
//QColor color = QColorDialog::getColor(Qt::red, this, tr("顏色對話框"),QColorDialog::ShowAlphaChannel);
//qDebug() <<"color:" <<color;

/***    第二種方式     ***/
QColorDialog dialog(Qt::red, this); // 創建對象
dialog.setOption(QColorDialog::ShowAlphaChannel);   // 顯示 alpha 選項
dialog.exec();  // 以模態方式運行對話框
QColor color = dialog.currentColor();   // 獲取顏色對話框當前顏色
qDebug() <<"color:" <<color;    // 輸出顏色信息

第一種方式,使用了 QColorDialog 的靜態函數 getColor() 來獲取顏色,它的3個參數的作用分別是設置初始顏色、父窗口和對話框標題。第一種方式的好處是不用不用創建對象。但是如果想要更靈活地設置時,采用第二種方式,先創建對象,然后進行各項設置。兩者的實現效果是等效的。


二、文件對話框

文件對話框類 QFileDialog 提供了一個允許用戶選擇文件或文件夾的對話框。

QString fileName = QFileDialog::getOpenFileName(this, tr("文件對話框"), "F:",tr("圖片文件(* png * jpg)"));
  • 這個函數的4個參數的作用分別是:指定父窗口、 設置對話框標題、指定默認打開的目錄路徑和設置文件類型過濾器。如果不指定文件過濾器,默認是選擇所有類型的文件。
  • 這里只選擇 png 和 jpg 兩種格式的圖片文件(注意代碼中 * png 和 * jpg 之間需要一個空格),那么在打開的文件對話框中只能顯示目錄下這兩種格式的文件。

還可以設置多個不同類別的過濾器,不同類別間使用兩個分號 “;;” 隔開,例如添加文本文件類型:

QString fileName = QFileDialog::getOpenFileName(this, tr("文件對話框"), "F:",tr("圖片文件(* png * jpg);;文本文件(* txt)"));

前面這個程序只能選擇單個文件,要同時選擇多個文件,可以使用 getOpenFileNames() 函數, 例如:

QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件對話框"), "F:",tr("圖片文件(* png * jpg);;文本文件(* txt)"));

除了上面的兩個函數,QFileDialog 類還提供了 getSaveFileName() 函數來實現保存文件對話框和文件另存為對話框,還有 getExistingDirectory() 函數來獲取一個已存在的文件夾路徑。


三、字體對話框

字體對話框 QFontDialog 類提供了一個可以選擇字體的對話框部件。

// ok 用於標記是否單擊了 OK 按鈕。然后獲得選擇的字體
bool ok;
QFont font = QFontDialog::getFont(&ok, this);
// 如果單擊 Cancel 按鈕,那么更改字體
if (ok)
    ui->pushButton_3->setFont(font);
else
    qDebug() <<tr("沒有選擇字體!");

這里使用了 QFileDidog 類的 getFont() 靜態函數來獲取選擇的字體。第一個參數是 bool 類型變量,用來存放按下的按鈕狀態,比如在打開的字體對話框中單擊了 OK 按鈕,那么這里的 ok 就為 true,從而告訴用戶已經選擇了字體。


四、輸入對話框

輸人對話框 QInputDialog 類用來提供一個簡單方便的對話框,從而從用戶那里獲取一個單一的數值或字符串。

bool ok;

// 獲取字符串
QString string = QInputDialog::getText(this, tr("輸入字符串對話框"),tr("請輸入用戶名:"),QLineEdit::Normal, tr("admin"), &ok);
if(ok)
qDebug() <<tr("string:") <<string;

// 獲取整數
int value1 = QInputDialog::getInt(this, tr("輸入整數對話框"),tr("請輸入 -1000到1000之間的數值"), 100, -1000, 1000, 10, &ok);
if(ok)
    qDebug() <<tr("value1:") <<value1;

// 獲取浮點數
double value2 = QInputDialog::getDouble(this, tr("輸入浮點數對話框"),tr("請輸入-1000到1000之間的數值"), 0.00, -1000, 1000, 2, &ok);
if(ok) qDebug() << "value2:" << value2;

// 獲取條目
QString item = QInputDialog::getItem(this, tr("輸入條目對話框"),tr("請選擇或輸入一個條目"), items, 0, true, &ok);
if(ok) qDebug() << "item:" << item;

這里一共創建了 4 個不同類型的輸入對話框。

  • getText() 函數可以提供一個可輸入字符串的對話框,參數的作用分別是:指定父窗口、設置窗口標題、設置對話框中的標簽的顯示文本、設置輸入的字符串的顯示模式、設置輸人框中的默認字符串和設置獲取按下按鈕信息的 bool 變量。
  • getInt() 函數可以提供一個輸入整型數值的對話框,其中的參數100表示默認的數值是100,-1000表示可輸入的最小值是-1000,1000表示可輸人的最大值是1000,10表示使用箭頭按鈕,數值每次變化10。
  • getDouble() 函數可以提供一 個輸人浮點型數值的對話框,其中的參數2表示小數的位數為2。
  • getltem() 函數提供一個可以輸入一個條目的對話框,需要先給它提供一些條目,例如這里定義的QStringList類型的items。它的參數0表示默認顯示列表中的第0個條目;然后是參數true,設置條目是否可以被更改,true就是可以被更改。

五、消息對話框

消息對話框 QMessageBox 類提供了 一個模態的對話框用來通知用戶一些信息,或者向用戶提出一個問題並且獲取答案。

// 問題對話框
int ret1 = QMessageBox::question(this, tr("問題對話框"),tr("你了解Qt嗎?"), QMessageBox::Yes, QMessageBox::No);
if(ret1 == QMessageBox::Yes) 
    qDebug() << tr("問題!");

// 提示對話框
int ret2 = QMessageBox::information(this, tr("提示對話框"),tr("這是Qt書籍!"), QMessageBox::Ok);
if(ret2 == QMessageBox::Ok) 
    qDebug() << tr("提示!");

// 警告對話框
int ret3 = QMessageBox::warning(this, tr("警告對話框"),tr("不能提前結束!"), QMessageBox::Abort);
if(ret3 == QMessageBox::Abort) 
    qDebug() << tr("警告!");

// 錯誤對話框
int ret4 = QMessageBox::critical(this, tr("嚴重錯誤對話框"),tr("發現一個嚴重錯誤!現在要關閉所有文件!"), QMessageBox::YesAll);
if(ret4 == QMessageBox::YesAll) 
    qDebug() << tr("錯誤");

// 關於對話框
QMessageBox::about(this, tr("關於對話框"),tr("yafeilinux致力於Qt及Qt Creator的普及工作!"));

這里創建了4個不同類型的消息對話框,分別擁有不同的圖標及提示音(這個是操作系統設置的),參數分別是父窗口、標題欄、顯示信息和擁有的按鈕。這里使用的按鈕都是 QMessageBox 類提供的標准按鈕,可以根據返回值來判斷用戶按下了哪個按鈕。

about() 函數沒有返回值,因為它默認只有一個按鈕,與其相似的還有一個 aboutQt() 函數,用來顯示現在使用的 Qt 版本等相關信息。如果想使用自己的圖標和自定義按鈕,那么可以創建 QMessageBox 類對象,然后使用相關函數進行操作。


六、進度對話框

進度對話框 QProgressDialog 對一個耗時較長的操作進度提供了反饋。

QProgressDialog dialog(tr("文件復制進度"), tr("取消"), 0, 50000, this);
dialog.setWindowTitle(tr("進度對話框"));     // 設置窗口標題
dialog.setWindowModality(Qt::WindowModal);  // 將對話框設置為模態
dialog.show();

// 演示復制進度
for(int i=0; i<50000; i++) 
{                
    dialog.setValue(i);                     // 設置進度條的當前值
    QCoreApplication::processEvents();      // 避免界面凍結
    if(dialog.wasCanceled()) // 按下取消按鈕則中斷
        break;         
}

dialog.setValue(50000);    // 這樣才能顯示100%,因為for循環中少加了一個數
qDebug() << tr("復制結束!");

這里創建了一個 QProgressDialog 類對象 dialog,構造函數的參數分別為對話框的標簽內容、取消按鈕的顯示文本、最小值、最大值和父窗口。然后將其設置為了模態對話框並顯示。

后面的 for() 循環語句模擬了文件復制過程,使用 setValue() 函數使進度條向前推進。為了避免長時間的操作而使用戶界面凍結,必須不斷調用 QCoreApplication 類的靜態函數 processEvents (), 可以將它放在 for() 循環語句中。

然后使用 QProgressDialog 的 wasCanceled() 函數來判斷用戶是否單擊了 “取消”按鈕,如果是, 則中斷復制過程。這里使用了模態對話框,其實 QProgressDialog 還可以實現非模態對話框,不過它需要定時器等的幫助。


七、錯誤信息對話框

錯誤信息對話框 QErrorMessage 類提供了一個顯示錯誤信息的對話框。

QErrorMessage *errordlg = new QErrorMessage(this);;

errordlg->setWindowTitle(tr("錯誤信息對話框"));
errordlg->showMessage(tr("這里是出錯信息!"));

這里新建了一個 QErrorMessage 對話框,並且調用它的 showMessage() 函數來顯示錯誤信息,調用這個函數時對話框會以非模態的形式顯示出來。


八、向導對話框

向導對話框 QWizard 類提供了一個設計向導界面的框架。對於向導對話框讀者應該已經很熟悉了,比如安裝軟件時的向導和創建項目時的向導。QWizard之所以被稱為框架,是因為它具有設計一個向導的全部功能函數,可以使用它來實現想要的效果。Qt 演示程序中的 Dialogs 分類下有 Trivial Wizard、License Wizard 和 Class Wizard這3個示例程序,可以參考一下。

這里定義了 3 個返回值為 QWizardPage 類對象的指針的函數,用來生成3個向導頁面:

QWizardPage * MyWidget::createPage1()  // 向導頁面1
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("介紹"));
    return page;
}

QWizardPage * MyWidget::createPage2()  // 向導頁面2
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("用戶選擇信息"));
    return page;
}

QWizardPage * MyWidget::createPage3()  // 向導頁面3
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("結束"));
    return page;
}

// 向導對話框
void MyWidget::on_pushButton_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle(tr("向導對話框"));
    wizard.addPage(createPage1());     // 添加向導頁面
    wizard.addPage(createPage2());
    wizard.addPage(createPage3());
    wizard.exec();
}

這里新建了 QWizard 類對象,然后使用 addPage() 函數為其添加了 3 個頁面,這里的參數是 QWizardPage 類型的指針,所以直接使用了生成向導頁面函數。運行程序可以看到,向導頁面出現的順序和添加向導頁面的順序是一致的。


到這里,Qt提供的幾個標准對話框就基本講完了。其實還有3個與打印有關的標准對話框類QPageSetupDialog(頁面設置對話框)、QPrintDialog(打印對話框)和 QPrintPreviewDialog(打印預覽對話框)這里暫時不介紹。關於這些對話框的使用,Qt提供了一個示例程序 Standard Dialogs,它在 Dialogs 分類中。



免責聲明!

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



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