《Qt學習之路》已經寫到了第15篇,然而現在再寫下去卻有點困難,原因是當初并沒有想到會連續的寫下去,是以并沒有很好的計劃這些内容究竟該怎樣去寫。雖然前面說過,本教程主要線路參考《C++ Gui Programming with Qt 4, 2nd Edition》,然而最近的章節由于原文是一個比較完整的項目而有所改變,是以現在不知道該從何寫起。
我并不打算介紹很多元件的使用,因為Qt有很多元件,各種元件用法衆多,根本不可能介紹完,隻能把API放在手邊,邊用邊查。是以,對于很多元件我隻是簡單的介紹一下,具體用法還請自行查找(确切地說,我知道的也并不多,很多時候還是要到API裡面去找)。
下面還是按照我們的進度,從Qt的标準對話框開始說起。所謂标準對話框,其實就是Qt内置的一些對話框,比如檔案選擇、顔色選擇等等。今天首先介紹一下QFileDialog。
QFileDialog是Qt中用于檔案打開和儲存的對話框,相當于Swing裡面的JFileChooser。下面打開我們前面使用的工程。我們已經很有先見之明的寫好了一個打開的action,還記得前面的代碼嗎?當時,我們隻是彈出了一個消息對話框(這也是一種标準對話框哦~)用于告知這個信号槽已經聯通,現在我們要寫真正的打開代碼了!
修改MainWindow的open函數:
void MainWindow::open()
{
QString path = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files(*.jpg *.png)"));
if(path.length() == 0) {
QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
} else {
QMessageBox::information(NULL, tr("Path"), tr("You selected ") + path);
}
}
編譯之前别忘記include QFileDialog哦!然後運作一下吧!點選打開按鈕,就會彈出打開對話框,然後選擇檔案或者直接點選取消,會有相應的消息提示。
QFileDialog提供了很多靜态函數,用于擷取使用者選擇的檔案。這裡我們使用的是getOpenFileName(), 也就是“擷取打開檔案名”,你也可以檢視API找到更多的函數使用。不過,這個函數的參數蠻長的,而且類型都是QString,并不好記。考慮到這種情況,Qt提供了另外的寫法:
QFileDialog *fileDialog = new QFileDialog(this);
fileDialog->setWindowTitle(tr("Open Image"));
fileDialog->setDirectory(".");
fileDialog->setFilter(tr("Image Files(*.jpg *.png)"));
if(fileDialog->exec() == QDialog::Accepted) {
QString path = fileDialog->selectedFiles()[0];
}
不過,這兩種寫法雖然功能差别不大,但是彈出的對話框卻并不一樣。getOpenFileName()函數在Windows和MacOS X平台上提供的是本地的對話框,而QFileDialog提供的始終是Qt自己繪制的對話框(還記得前面說過,Qt的元件和Swing類似,也是自己繪制的,而不都是調用系統資源API)。
為了說明QFileDialog::getOpenFileName()函數的用法,還是先把函數簽名放在這裡:
QString QFileDialog::getOpenFileName (
QWidget * parent = 0,
const QString & caption = QString(),
const QString & dir = QString(),
const QString & filter = QString(),
QString * selectedFilter = 0,
Options options = 0 )
第一個參數parent,用于指定父元件。注意,很多Qt元件的構造函數都會有這麼一個parent參數,并提供一個預設值0;
第二個參數caption,是對話框的标題;
第三個參數dir,是對話框顯示時預設打開的目錄,"." 代表程式運作目錄,"/" 代表目前盤符的根目錄(Windows,Linux下/就是根目錄了),也可以是平台相關的,比如"C:\\"等;
第四個參數filter,是對話框的字尾名過濾器,比如我們使用"Image Files(*.jpg *.png)"就讓它隻能顯示字尾名是jpg或者png的檔案。如果需要使用多個過濾器,使用";;"分割,比如"JPEG Files(*.jpg);;PNG Files(*.png)";
第五個參數selectedFilter,是預設選擇的過濾器;
第六個參數options,是對話框的一些參數設定,比如隻顯示檔案夾等等,它的取值是enum QFileDialog::Option,每個選項可以使用 | 運算組合起來。
如果我要想選擇多個檔案怎麼辦呢?Qt提供了getOpenFileNames()函數,其傳回值是一個QStringList。你可以把它了解成一個隻能存放QString的List,也就是STL中的list<string>。
好了,我們已經能夠選擇打開檔案了。儲存也是類似的,QFileDialog類也提供了儲存對話框的函數getSaveFileName,具體使用還是請查閱API。
本文轉自 FinderCheng 51CTO部落格,原文連結:http://blog.51cto.com/devbean/213414