在上一节课中,所在文件的路径被我们硬编程到了代码中,我们无法进行选择,那么有没有一种方式让我们可以自由的选择文件呢?有的兄弟,有的!像这样的有QFileDialog
。
QFileDialog
是 Qt 框架中用于文件对话框的类,它提供了让用户选择文件或目录的标准对话框。这个类是 Qt Widgets 模块的一部分,继承自 QDialog
类。
如果在代码中使用到 QFileDialog
,须包含头文件 #include <QFileDialog>
,其构造函数有很多,常用的为:
QFileDialog(QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &directory = QString(),
const QString &filter = QString())
参数说明
parent
(QWidget指针,默认为nullptr) caption
(QString,默认为空字符串) directory
(QString,默认为空字符串) filter
(QString,默认为空字符串) QFileDialog的成员函数很多,下列罗列最常用的成员函数:
getOpenFileName()
功能:弹出标准"打开文件"对话框
参数:父窗口指针、标题、初始目录、文件过滤器
返回:用户选择的单个文件路径(QString
)
示例:
QString file = QFileDialog::getOpenFileName(this, "打开文件", "/home", "文本文件 (*.txt)");
getSaveFileName()
功能:弹出标准"保存文件"对话框
参数:同上
返回:用户输入的保存路径(QString
)
示例:
QString savePath = QFileDialog::getSaveFileName(this, "保存文件", "/home/untitled.txt", "PDF文件 (*.pdf)");
getExistingDirectory()
功能:选择目录对话框
参数:父窗口指针、标题、初始目录
返回:选择的目录路径(QString
)
示例:
QString dir = QFileDialog::getExistingDirectory(this, "选择文件夹", "/home");
getOpenFileNames()
功能:多文件选择对话框
参数:同getOpenFileName()
返回:用户选择的多个文件路径(QStringList
)
示例:
QStringList files = QFileDialog::getOpenFileNames(this, "选择多个文件", "/home", "图片 (*.png *.jpg)");
setFileMode(QFileDialog::FileMode)
可选模式: AnyFile
:输入任意文件名(用于保存)ExistingFile
:选择单个现有文件Directory
:仅选择目录ExistingFiles
:选择多个现有文件setNameFilter(const QString&)
示例:dialog.setNameFilter("文本文件 (*.txt);;CSV文件 (*.csv)");
setAcceptMode(QFileDialog::AcceptMode)
可选模式: AcceptOpen
:打开文件模式AcceptSave
:保存文件模式setViewMode(QFileDialog::ViewMode)
可选模式: List
:简单列表视图Detail
:带详细信息的视图selectedFiles()
:返回用户选择的文件路径列表(QStringList
)selectedNameFilter()
:返回当前选择的过滤器名称(QString
)setDirectory(const QString&)
:设置初始目录setDefaultSuffix(const QString&)
:设置默认文件后缀(如自动补全.txt
)setOption(QFileDialog::Option, bool)
常用选项: DontUseNativeDialog
:强制使用Qt风格对话框ReadOnly
:禁止编辑文件名ShowDirsOnly
:仅显示目录实验目的
打开存在的文件,并读取文件内的内容;
实验代码
#include <QApplication> // 提供 Qt 应用程序的主类
#include <QFileDialog> // 提供文件选择对话框功能
#include <QStringList> // 提供字符串列表类
#include <QString> // 提供字符串类
#include <QMessageBox> // 提供消息对话框(未使用,但可以用于弹窗提示)
#include <QFile> // 提供文件读写操作类
#include <QDebug> // 提供调试输出功能
int main(int argc, char *argv[])
{
// 创建一个 Qt 应用程序对象
QApplication app(argc, argv);
// 弹出文件选择对话框,让用户选择一个文件
QString fileName = QFileDialog::getOpenFileName(
nullptr, // 父窗口为 nullptr,表示无父窗口
"打开文件", // 文件对话框的标题
"D:/王涵", // 初始打开目录
"所有文件 (*.*);;图片 (*.png *.jpg)" // 文件过滤器,显示所有文件和常见图片文件
);
// 判断用户是否选择了文件(如果点击“取消”,则 fileName 会是空字符串)
if (!fileName.isEmpty())
{
// 输出用户选择的文件路径到调试信息
qDebug() << "选择的文件:" << fileName;
QFile file; // 创建一个文件对象
file.setFileName(fileName); // 设置文件路径为用户选择的路径
// 以只读 + 文本方式打开文件
file.open(QIODevice::ReadOnly | QIODevice::Text);
// 使用 QTextStream 流对象读取文本内容
QTextStream out(&file);
// 持续读取每一行,直到文件结束
while (!out.atEnd())
{
QString str_len = out.readLine(); // 读取一行文本
qDebug() << str_len; // 输出读取的内容
}
file.close(); // 关闭文件
}
else
{
// 用户没有选择任何文件(可能点击了“取消”按钮)
qDebug() << "用户取消了选择";
}
return app.exec(); // 进入 Qt 主事件循环
}
实验现象
实验目的
在文件选择框中,在某一地址下创建一个新的文件,并在文件中写入内容!
实验代码
#include <QApplication> // Qt GUI 应用程序的核心类,必须包含
#include <QFileDialog> // 提供文件对话框(打开/保存)的功能
#include <QStringList> // 提供字符串列表类型(本例中其实没用到,可移除)
#include <QString> // 提供 QString 字符串类型
#include <QMessageBox> // 用于弹出提示框(本例中未使用,可移除)
#include <QFile> // 文件操作的核心类(读写文件)
#include <QDebug> // 提供调试输出功能(用于输出日志)
int main(int argc, char *argv[])
{
QApplication app(argc, argv); // 初始化 Qt 应用程序,必须有,argc/argv 负责传递命令行参数
// 弹出“保存文件”的对话框,用户可以选择要保存的路径和文件名
QString fileName = QFileDialog::getSaveFileName(
nullptr, // 父窗口为 nullptr,表示无主窗口
"打开文件", // 对话框标题(建议修改为“保存文件”更合理)
("D:/王涵/save.txt"), // 默认路径和文件名(可修改为用户目录等)
"所有文件 (*.*);;图片 (*.png *.jpg);;文本文件(*.txt)" // 可选择的文件类型过滤器
);
// 判断用户是否选择了文件(如果取消保存对话框,fileName 就是空字符串)
if (!fileName.isEmpty())
{
qDebug() << "选择的文件:" << fileName; // 输出用户选择的文件路径
QFile file; // 创建一个 QFile 文件对象
file.setFileName(fileName); // 设置文件的路径和名称为用户选择的 fileName
// 尝试以“写入 + 文本模式”打开文件,如果文件不存在,会自动创建
// 注意:若打开失败应检查路径是否有效、权限是否足够
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream in(&file); // 创建文本流,用于向文件中写入文本内容
// 向文件中写入 0 到 4 的数字,每个数字占一行
for (uint i = 0; i < 5; i++)
{
in << i << "\r\n"; // "\r\n" 是 Windows 格式的换行符(也可以用 Qt::endl)
}
file.close(); // 写入完成后关闭文件,释放资源
}
else
{
// 如果打开失败,输出错误信息
qDebug() << "文件打开失败:" << file.errorString();
}
}
else
{
qDebug() << "用户取消了选择"; // 用户点击了“取消”按钮,没有进行保存操作
}
return app.exec(); // 启动 Qt 应用程序主事件循环(本例中其实可以直接 return 0)
}
实验现象
成功在指定文件路径下的指定文件中写入了指定的内容:
实验目的
可以一次选择若干个存在的文件,并打印文件的路径
实验代码
#include <QApplication>
#include <QFileDialog>
#include <QStringList>
#include <QString>
#include <QMessageBox>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv); // 初始化 Qt 应用程序对象
// 弹出“打开多个文件”的文件对话框
QStringList fileName = QFileDialog::getOpenFileNames(
nullptr, // 无父窗口
"打开文件", // 对话框标题
"D:/王涵/", // 默认打开路径
"所有文件 (*.*);;图片 (*.png *.jpg);;文本文件 (*.txt)" // 文件过滤器,注意必须是第4个参数
);
// 如果用户选择了文件
if (!fileName.isEmpty())
{
// 遍历用户选择的所有文件路径
foreach(QString file, fileName)
{
qDebug() << file; // 输出每个文件的完整路径
}
}
else
{
qDebug() << "用户取消了选择"; // 用户点击了“取消”按钮
}
return app.exec(); // 启动 Qt 事件循环(本例中可用 return 0 替代)
}
实验现象
本文我们学习了在QT中如何使用 QFileDialog
这一重要的类,并给出详细的示例。
我们明白了文件选择常常和打开文件,操作文件等操作联系在一起,形成一套完整的操作流。
附录
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有