鍍金池/ 教程/ C/ Qt 標(biāo)準(zhǔn)對話框之 QFileDialog
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對話框之 QFileDialog
自定義 model 之二
深入了解信號槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡易畫板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺的程序
MainWindow
初探信號槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對話框(上)
一個(gè)簡易畫板的實(shí)現(xiàn)(QWidget)

Qt 標(biāo)準(zhǔn)對話框之 QFileDialog

《Qt 學(xué)習(xí)之路》已經(jīng)寫到了第15篇,然而現(xiàn)在再寫下去卻有點(diǎn)困難,原因是當(dāng)初并沒有想到會連續(xù)的寫下去,因此并沒有很好的計(jì)劃這些內(nèi)容究竟該怎樣去寫。雖然前面說過,本教程主要線路參考《C++ Gui Programming with Qt 4, 2nd Edition》,然而最近的章節(jié)由于原文是一個(gè)比較完整的項(xiàng)目而有所改變,因此現(xiàn)在不知道該從何寫起。

我并不打算介紹很多組件的使用,因?yàn)?Qt 有很多組件,各種組件用法眾多,根本不可能介紹完,只能把API 放在手邊,邊用邊查。所以,對于很多組件我只是簡單的介紹一下,具體用法還請自行查找(確切地說,我知道的也并不多,很多時(shí)候還是要到 API 里面去找)。

下面還是按照我們的進(jìn)度,從 Qt 的標(biāo)準(zhǔn)對話框開始說起。所謂標(biāo)準(zhǔn)對話框,其實(shí)就是 Qt 內(nèi)置的一些對話框,比如文件選擇、顏色選擇等等。今天首先介紹一下 QFileDialog。

QFileDialog 是 Qt 中用于文件打開和保存的對話框,相當(dāng)于 Swing 里面的 JFileChooser。下面打開我們前面使用的工程。我們已經(jīng)很有先見之明的寫好了一個(gè)打開的 action,還記得前面的代碼嗎?當(dāng)時(shí),我們只是彈出了一個(gè)消息對話框(這也是一種標(biāo)準(zhǔn)對話框哦~)用于告知這個(gè)信號槽已經(jīng)聯(lián)通,現(xiàn)在我們要寫真正的打開代碼了!

修改 MainWindow 的 open 函數(shù):

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 哦!然后運(yùn)行一下吧!點(diǎn)擊打開按鈕,就會彈出打開對話框,然后選擇文件或者直接點(diǎn)擊取消,會有相應(yīng)的消息提示。

QFileDialog 提供了很多靜態(tài)函數(shù),用于獲取用戶選擇的文件。這里我們使用的是 getOpenFileName(), 也就是“獲取打開文件名”,你也可以查看 API 找到更多的函數(shù)使用。不過,這個(gè)函數(shù)的參數(shù)蠻長的,而且類型都是 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]; 
                QMessageBox::information(NULL, tr("Path"), tr("You selected ") + path); 
        } else { 
                QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files.")); 
        }

不過,這兩種寫法雖然功能差別不大,但是彈出的對話框卻并不一樣。getOpenFileName()函數(shù)在Windows 和 MacOS X 平臺上提供的是本地的對話框,而 QFileDialog 提供的始終是 Qt 自己繪制的對話框(還記得前面說過,Qt 的組件和 Swing 類似,也是自己繪制的,而不都是調(diào)用系統(tǒng)資源API)。

為了說明 QFileDialog::getOpenFileName()函數(shù)的用法,還是先把函數(shù)簽名放在這里:

QString QFileDialog::getOpenFileName (
          QWidget * parent = 0,
          const QString & caption = QString(),
          const QString & dir = QString(),
          const QString & filter = QString(),
          QString * selectedFilter = 0,
          Options options = 0 )

第一個(gè)參數(shù) parent,用于指定父組件。注意,很多 Qt 組件的構(gòu)造函數(shù)都會有這么一個(gè) parent 參數(shù),并提供一個(gè)默認(rèn)值0;

第二個(gè)參數(shù) caption,是對話框的標(biāo)題;

第三個(gè)參數(shù) dir,是對話框顯示時(shí)默認(rèn)打開的目錄,"." 代表程序運(yùn)行目錄,"/" 代表當(dāng)前盤符的根目錄(Windows,Linux下/就是根目錄了),也可以是平臺相關(guān)的,比如"C:\"等;

第四個(gè)參數(shù) filter,是對話框的后綴名過濾器,比如我們使用"Image Files(.jpg .png)"就讓它只能顯示后綴名是 jpg 或者 png 的文件。如果需要使用多個(gè)過濾器,使用";;"分割,比如"JPEG Files(.jpg);;PNG Files(.png)";

第五個(gè)參數(shù) selectedFilter,是默認(rèn)選擇的過濾器;

第六個(gè)參數(shù) options,是對話框的一些參數(shù)設(shè)定,比如只顯示文件夾等等,它的取值是 enum QFileDialog::Option,每個(gè)選項(xiàng)可以使用 | 運(yùn)算組合起來。

如果我要想選擇多個(gè)文件怎么辦呢?Qt 提供了 getOpenFileNames()函數(shù),其返回值是一個(gè)QStringList。你可以把它理解成一個(gè)只能存放 QString 的 List,也就是 STL 中的list。

好了,我們已經(jīng)能夠選擇打開文件了。保存也是類似的,QFileDialog 類也提供了保存對話框的函數(shù)getSaveFileName,具體使用還是請查閱 API。

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031