Qt 內建豐富的標準對話框 (QFileDialog, QColorDialog, QFontDialog…),本篇聚焦 QFileDialog:以靜態便利函式與物件導向兩種風格實作「開啟圖片」功能,並說明跨平台原生對話框與 Qt 自繪對話框的差異。
getOpenFileName() (最簡潔)
void MainWindow::open() {
QString path = QFileDialog::getOpenFileName(
this, // 父視窗
tr("Open Image"), // 標題
".", // 起始目錄 (當前工作目錄)
tr("Image Files (*.jpg *.png)") // 過濾器
);
if (path.isEmpty()) {
QMessageBox::information(this, tr("Path"), tr("You didn't select any files."));
} else {
QMessageBox::information(this, tr("Path"), tr("You selected ") + path);
// 後續:載入圖片、顯示於 QLabel/QGraphicsView 等
}
}
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 | 父視窗,用於模態層級與定位 | this |
caption | 對話框標題 | tr("Open Image") |
dir | 起始目錄 | "." (當前目錄)、"/" (根目錄)、"C:/" |
filter | 檔案過濾器 | "Images (*.jpg *.png);;Text (*.txt)" (雙分號分隔多組) |
selectedFilter | 預設選中的過濾器 (輸出參數) | 傳遞 QString* 接收使用者實際選擇的過濾器 |
options | 行為旗標組合 | DontUseNativeDialog | ShowDirsOnly |
QFileDialog 實例 (彈性更高)
QFileDialog *dlg = new QFileDialog(this);
dlg->setWindowTitle(tr("Open Image"));
dlg->setDirectory(".");
dlg->setNameFilter(tr("Image Files (*.jpg *.png)"));
if (dlg->exec() == QDialog::Accepted) {
QString path = dlg->selectedFiles().first(); // 取得第一個選中檔案
QMessageBox::information(this, tr("Path"), tr("You selected ") + path);
} else {
QMessageBox::information(this, tr("Path"), tr("You didn't select any files."));
}
delete dlg;
| 特性 | getOpenFileName() | QFileDialog 實例 |
|---|---|---|
| 程式碼長度 | 極短 | 較長 |
| 對話框外觀 | 原生 (Windows/Mac 系統風格) | Qt 自繪 (跨平台一致風格) |
| 多檔選擇 | 改用 getOpenFileNames() 回傳 QStringList | setFileMode(QFileDialog::ExistingFiles) + selectedFiles() |
| 自訂側邊欄/預覽 | 不支援 | 支援 setSidebarUrls(), setViewMode() 等 |
對稱提供 getSaveFileName() 與 QFileDialog::AcceptSave 模式,用法類似,filter 建議包含預設副檔名 (如 "Text (*.txt)") 讓使用者免輸入副檔名。
// 靜態函式版
QStringList files = QFileDialog::getOpenFileNames(
this, tr("Open Images"), ".", tr("Images (*.jpg *.png)"));
foreach (const QString &f, files) { /* 處理每個檔案 */ }
// 物件版
dlg->setFileMode(QFileDialog::ExistingFiles);
if (dlg->exec() == QDialog::Accepted) {
QStringList files = dlg->selectedFiles();
// ...
}
本文整理自「豆子空間」博客,原文出處:https://devbean.blog.51cto.com/448512/213414