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 分類中。