Qt 入門 4 之標準對話框
Qt提供了一些常用的對話框類型,它們全部繼承自QDialog類,并增加了自己的特色功能,比如獲取顏色、顯示特定信息等。下面簡單講解這些對話框,可以在幫助索引中查看Standard Dialogs關鍵字,也可以直接索引相關類的類名。
- 本文將以一個新的項目為主介紹不同類型的對話框,新建Qt Widgets 應用程序,雙擊ui文件后添加按鈕并修改文字顯示:
- 顏色對話框
- 顏色對話框 QColorDialog 提供了一個可以獲取指定顏色的對話框部件
- 設計模式下點擊.ui文件,選中顏色對話框按鈕,右鍵轉到槽選中clicked() 后進入函數定義并修改如下:
void MyWidget::on_pushButton_clicked()
{QColor color=QColorDialog::getColor(Qt::red,this,tr("顏色對話框"));qDebug()<<"color:"<<color;
}
-
編譯執行如下圖,這里使用了 QColorDialog的靜態函數getColor()來獲取顏色,它的3個參數的作用分別是:設置初始顏色、指定父窗口和設置對話框標題。這里的Qt::red是Qt預定義的顏色對象,可以直接單擊該字符串,然后按下F1查看其快捷幫助,或者在幫助索引中通過 Qt::GlobalColor 關鍵字,從而查看到所有的預定義顏色列表。**getColor()**函數返回一個 QColor類型數據。現在運行程序,然后單擊“顏色對話框”按鈕,如果不選擇顏色,直接單擊 OK,那么輸出信息應該是QColor(ARGB1,1,0,0),這里的4個數值分別代表透明度(alpha)、紅色(red)、綠色(green)和藍色(blue)。它們的數值都是從0.0-1.0,有效數字為6位。對于alpha來說,1.0表示完全不透明,這是默認值,而0.0表示完全透明。對于三基色紅、綠、藍的數值,還可以使用0-255來表示,顏色對話框中就是使用這種方法。其中,0表示顏色最淺,255表示顏色最深。在0-255與0.0-1.0之間可以通過簡單的數學運算來對應,其中0對應0.0,255對應1.0。
-
在顏色對話框中還可以添加對alpha的設置,就是在**getColor()**函數中再使用最后一個參數:
QColor color=QColorDialog::getColor(Qt::red,this,tr("顏色對話框"),QColorDialog::ShowAlphaChannel);
qDebug()<<"color:"<<color;
- 前邊使用了
QColorDialog
類的靜態函數來直接顯示顏色對話框,好處是不用創建對象,但是如果想要更靈活的設置,則可以先創建對象,然后進行各項設置:
void MyWidget::on_pushButton_clicked()
{QColorDialog dialog(Qt::red,this); //創建對象dialog.setOption(QColorDialog::ShowAlphaChannel);dialog.exec(); //以模態方式運行對話框QColor color=dialog.currentColor();qDebug()<<"color:"<<color;
}
2.文件對話框
- 文件對話框QFileDialog類提供了一個允許用戶選擇文件或文件夾的對話框。繼續在
mywidget.cpp
中添加#include<QFileDialog>
頭文件,然后從設計模式轉到“文件對話框”按鈕的單擊信號槽,并更改如下:
void MyWidget::on_pushButton_5_clicked()
{//將會打開默認盤中的后綴文件QString filename=QFileDialog::getOpenFileName(this,tr("文件對話框"),"D:",tr("圖片文件(*png*jpg"));qDebug()<<"fileName:"<<filename;
}
- 這里使用了 QFileDialog類中的**getOpenFileName()**函數來獲取選擇的文件名,它的4個參數的作用分別是:指定父窗口設置對話框標題、指定默認打開的目錄路徑和設置文件類型過濾器。這個函數會以模態方式運行一個文件對話框。打開后選擇一個文件,單擊“打開”按鈕后,這個函數便可以返回選擇的文件的文件名。如果不指定文件過濾器,則默認選擇所有類型的文件。這里指定了只選擇png和jpg兩種格式的圖片
- 也支持同時選擇其他類型的文件:
QString filename=QFileDialog::getOpenFileName(this,tr("文件對話框"),"D:",tr("圖片文件(*png*jpg);;文本文件(*txt)"));
- 前邊只支持選擇單個文件,要同時選擇多個文件,則可以使用getOpenFileNames()函數:
QStringList filenames=QFileDialog::getOpenFileNames(this,tr("文件對話框"),"F:",tr("圖片文件(*png,jpg"));
- 運行程序就可以同時選擇多個圖片文件了,多個文件名存放在QStringList類型變量中。當然也可以不使用這些靜態函數,而是建立對話框對象來操作。除了上面的兩個函數外,QFileDialog類還提供了
getSaveFileName()
函數來實現保存文件對話框和文件另存為對話框,還有getExistingDirectory()
函數來獲取一個已存在的文件夾路徑。因為它們的用法與上面的例子類似,這里就不再舉例。
- 字體對話框
- 字體對話框QFontDialog類提供了一個可以選擇字體的對話框部件。先添加
#include <QFontDialog>
頭文件,然后轉到“字體對話框”按鈕的單擊信號槽,更改如下:
void MyWidget::on_pushButton_2_clicked()
{//ok用于標記是否單擊了 OK 按鈕bool ok;QFont font=QFontDialog::getFont(&ok,this);//如果單擊OK按鈕,那么讓“字體對話框”按鈕使用新字體//如果單擊Cancel按鈕,那么輸出信息if(ok)ui->pushButton_2->setFont(font);elseqDebug()<<tr("沒有選擇字體!");
}
- 這里使用了QFileDialog類的 getFont() 靜態函數來獲取選擇的字體。這個函數的第一個參數是bool類型變量,用來存放按下的按鈕狀態,比如在打開的字體對話框中單擊了OK按鈕,那么這里的ok就為true,這樣來告訴程序已經選擇了字體,如下圖是選擇了微軟雅黑 14號字體的顯示結果:
- 輸入對話框
- 輸入對話框 QInputDialog類用來提供一個對話框,可以讓用戶輸入一個單一的數值或字符串。先添加頭文件
#include <QInputDialog>
,然后進入“輸人對話框”按鈕的單擊信號槽,更改如下:
void MyWidget::on_pushButton_6_clicked()
{bool ok;//獲取字符串QString string = QInputDialog::getText(this,tr("輸入字符串對話框"),tr("請輸入用戶名"),QLineEdit::Normal,tr("admin"),&ok);if(ok)qDebug()<<"string:"<<string;//獲取整數int value = QInputDialog::getInt(this,tr("輸入整數對話框"),tr("請輸入-1000到1000之間的數值"),100,-1000,1000,10,&ok);if(ok)qDebug()<<"value:"<<value;//獲取浮點數double value2=QInputDialog::getDouble(this,tr("輸入浮點數對話框"),tr("請輸入-1000到1000之間的數值"),0.00,-1000,1000,2,&ok);if(ok)qDebug()<<"value2:"<<value2;QStringList items;items<<tr("條目1")<<tr("條目2");//獲取條目QString item=QInputDialog::getItem(this,tr("輸入條目對話框"),tr("請選擇或輸入一個條目"),items,0,true,&ok);if(ok)qDebug()<<"item:"<<item;
}
- 分別使用不同的函數定義了輸入不同類型的對話框,運行如下:
- 消息對話框
- 消息對話框QMessageBox類提供了一個模態的對話框來通知用戶一些信息,或者向用戶提出一個問題并且獲取答案。先添加頭文件#include,然后轉到“消息對話框”按鈕的單擊信號槽中,添加如下代碼:
void MyWidget::on_pushButton_3_clicked()
{//問題對話框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::Yes,QMessageBox::No);if(ret3 == QMessageBox::Abort)qDebug()<<tr("警告!");//錯誤對話框int ret4 = QMessageBox::critical(this,tr("嚴重錯誤對話框"),tr("發現一個嚴重錯誤!"),QMessageBox::Yes,QMessageBox::No);if(ret4 == QMessageBox::YesAll)qDebug()<<tr("錯誤!");//關于對話框QMessageBox::about(this,tr("關于對話框"),tr("Qt Creator 普及工作!"));
}
- 進度對話框
- 進度對話框 QProgressDialog對一個耗時較長操作的進度提供了反饋。先添加
#include <QProgressDialog>
頭文件,然后轉到“進度對話框”按鈕的單擊信號槽,更改如下:
void MyWidget::on_pushButton_7_clicked()
{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(); //避免界面凍結//QThread::sleep(1);if(dialog.wasCanceled())break;}dialog.setValue(50000); //這樣才顯示100%,因為for循環中少加了一個數qDebug()<<tr("復制結束!");
}
- 錯誤信息對話框
- 錯誤信息對話框QErrorMessage類提供了一個顯示錯誤信息的對話框。首先打開
mywidget.h
文件添加類前置聲明:
class QErrorMessage;
- 然后添加私有對象:
ErrorMessage *errordlg;
- 下面到
mywidget.cpp
添加頭文件#include <QErrorMessage>
,并在構造函數中添加如下代碼:
errordlg=newQErrorMessage(this);
- 然后從設計模式轉到“錯誤信息對話框”按鈕的單擊信號槽添加代碼
void Mywidget::on pushButton 7 clicked()
{errordlg->setwindowTitle(tr("錯誤信息對話框"));errordlg->showMessage(tr("這里是出錯信息!”));
}
- 運行如下:
- 向導對話框
- 向導對話框QWizard類提供了一個設計向導界面的框架。對于向導對話框,讀者應該已經很熟悉了,比如安裝軟件時的向導和創建項目時的向導。QWizard之所以被稱為框架,是因為它具有設計一個向導全部的功能函數,可以使用它來實現想要的效果。Qt中包含了 Trivial Wizard、License Wizard和Class Wizard這3個示例程序,可以參考一下。
- 打開
mywidget.h
文件,然后添加頭文件#include <QWizard>
,在MyWidget 類的聲明中添加private類型函數聲明:
QWizardPage* createPage1();QWizardPage* createPage2();QWizardPage* createPage3();
- 這里聲明了3個返回值為QWizardPage類對象的指針函數,用來生成3個向導頁面。然后在
mywidget.cpp
文件中對這3個函數進行定義:
QWizardPage* MyWidget::createPage1()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("介紹"));return page;
}
QWizardPage* MyWidget::createPage2()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("用戶選擇信息"));return page;
}
QWizardPage* MyWidget::createPage3()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("結束"));return page;
}
- 在各個函數中分別新建了向導頁面,并且設置了它們的標題。下面轉到“向導對話框”按鈕的單擊信號槽中,更改如下:
void MyWidget::on_pushButton_8_clicked()
{QWizard wizard(this);wizard.setWindowTitle(tr("向導對話框"));wizard.addPage(createPage1()); //添加向導對話框wizard.addPage(createPage2());wizard.addPage(createPage3());wizard.exec();
}
- 運行如下: