W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
《Qt 學(xué)習(xí)之路》已經(jīng)寫(xiě)到了第15篇,然而現(xiàn)在再寫(xiě)下去卻有點(diǎn)困難,原因是當(dāng)初并沒(méi)有想到會(huì)連續(xù)的寫(xiě)下去,因此并沒(méi)有很好的計(jì)劃這些內(nèi)容究竟該怎樣去寫(xiě)。雖然前面說(shuō)過(guò),本教程主要線路參考《C++ Gui Programming with Qt 4, 2nd Edition》,然而最近的章節(jié)由于原文是一個(gè)比較完整的項(xiàng)目而有所改變,因此現(xiàn)在不知道該從何寫(xiě)起。
我并不打算介紹很多組件的使用,因?yàn)?Qt 有很多組件,各種組件用法眾多,根本不可能介紹完,只能把API 放在手邊,邊用邊查。所以,對(duì)于很多組件我只是簡(jiǎn)單的介紹一下,具體用法還請(qǐng)自行查找(確切地說(shuō),我知道的也并不多,很多時(shí)候還是要到 API 里面去找)。
下面還是按照我們的進(jìn)度,從 Qt 的標(biāo)準(zhǔn)對(duì)話框開(kāi)始說(shuō)起。所謂標(biāo)準(zhǔn)對(duì)話框,其實(shí)就是 Qt 內(nèi)置的一些對(duì)話框,比如文件選擇、顏色選擇等等。今天首先介紹一下 QFileDialog。
QFileDialog 是 Qt 中用于文件打開(kāi)和保存的對(duì)話框,相當(dāng)于 Swing 里面的 JFileChooser。下面打開(kāi)我們前面使用的工程。我們已經(jīng)很有先見(jiàn)之明的寫(xiě)好了一個(gè)打開(kāi)的 action,還記得前面的代碼嗎?當(dāng)時(shí),我們只是彈出了一個(gè)消息對(duì)話框(這也是一種標(biāo)準(zhǔn)對(duì)話框哦~)用于告知這個(gè)信號(hào)槽已經(jīng)聯(lián)通,現(xiàn)在我們要寫(xiě)真正的打開(kāi)代碼了!
修改 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)擊打開(kāi)按鈕,就會(huì)彈出打開(kāi)對(duì)話框,然后選擇文件或者直接點(diǎn)擊取消,會(huì)有相應(yīng)的消息提示。
QFileDialog 提供了很多靜態(tài)函數(shù),用于獲取用戶選擇的文件。這里我們使用的是 getOpenFileName(), 也就是“獲取打開(kāi)文件名”,你也可以查看 API 找到更多的函數(shù)使用。不過(guò),這個(gè)函數(shù)的參數(shù)蠻長(zhǎng)的,而且類型都是 QString,并不好記??紤]到這種情況,Qt 提供了另外的寫(xiě)法:
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."));
}
不過(guò),這兩種寫(xiě)法雖然功能差別不大,但是彈出的對(duì)話框卻并不一樣。getOpenFileName()函數(shù)在Windows 和 MacOS X 平臺(tái)上提供的是本地的對(duì)話框,而 QFileDialog 提供的始終是 Qt 自己繪制的對(duì)話框(還記得前面說(shuō)過(guò),Qt 的組件和 Swing 類似,也是自己繪制的,而不都是調(diào)用系統(tǒng)資源API)。
為了說(shuō)明 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ù)都會(huì)有這么一個(gè) parent 參數(shù),并提供一個(gè)默認(rèn)值0;
第二個(gè)參數(shù) caption,是對(duì)話框的標(biāo)題;
第三個(gè)參數(shù) dir,是對(duì)話框顯示時(shí)默認(rèn)打開(kāi)的目錄,"." 代表程序運(yùn)行目錄,"/" 代表當(dāng)前盤(pán)符的根目錄(Windows,Linux下/就是根目錄了),也可以是平臺(tái)相關(guān)的,比如"C:\"等;
第四個(gè)參數(shù) filter,是對(duì)話框的后綴名過(guò)濾器,比如我們使用"Image Files(.jpg .png)"就讓它只能顯示后綴名是 jpg 或者 png 的文件。如果需要使用多個(gè)過(guò)濾器,使用";;"分割,比如"JPEG Files(.jpg);;PNG Files(.png)";
第五個(gè)參數(shù) selectedFilter,是默認(rèn)選擇的過(guò)濾器;
第六個(gè)參數(shù) options,是對(duì)話框的一些參數(shù)設(shè)定,比如只顯示文件夾等等,它的取值是 enum QFileDialog::Option,每個(gè)選項(xiàng)可以使用 | 運(yùn)算組合起來(lái)。
如果我要想選擇多個(gè)文件怎么辦呢?Qt 提供了 getOpenFileNames()函數(shù),其返回值是一個(gè)QStringList。你可以把它理解成一個(gè)只能存放 QString 的 List,也就是 STL 中的list。
好了,我們已經(jīng)能夠選擇打開(kāi)文件了。保存也是類似的,QFileDialog 類也提供了保存對(duì)話框的函數(shù)getSaveFileName,具體使用還是請(qǐng)查閱 API。
本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: