前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >QFileDialog文件选择框

QFileDialog文件选择框

作者头像
破晓的历程
发布于 2025-05-15 01:10:47
发布于 2025-05-15 01:10:47
10600
代码可运行
举报
文章被收录于专栏:破晓破晓
运行总次数:0
代码可运行

1.引言

在上一节课中,所在文件的路径被我们硬编程到了代码中,我们无法进行选择,那么有没有一种方式让我们可以自由的选择文件呢?有的兄弟,有的!像这样的有QFileDialog

QFileDialog 是 Qt 框架中用于文件对话框的类,它提供了让用户选择文件或目录的标准对话框。这个类是 Qt Widgets 模块的一部分,继承自 QDialog 类。

2.简单介绍

如果在代码中使用到 QFileDialog,须包含头文件 #include <QFileDialog>,其构造函数有很多,常用的为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QFileDialog(QWidget *parent = nullptr, 
           const QString &caption = QString(), 
           const QString &directory = QString(), 
           const QString &filter = QString())

参数说明

  1. parent (QWidget指针,默认为nullptr)
    • 指定对话框的父窗口
    • 设置父窗口有助于对话框的模态行为和内存管理
    • 如果为nullptr,对话框将作为顶级窗口
  2. caption (QString,默认为空字符串)
    • 对话框的标题文字
    • 例如:“打开文件”、"保存文件"等
  3. directory (QString,默认为空字符串)
    • 对话框打开时显示的初始目录
    • 可以是绝对路径或相对路径
    • 如果为空,将使用上次访问的目录或系统默认目录
  4. filter (QString,默认为空字符串)
    • 文件过滤器,用于限制显示的文件类型
    • 格式为:“描述 (.扩展名);;描述 (.扩展名)”
    • 例如:“Images (.png *.jpg);;Text files (*.txt);;All files (.*)”

2.1成员函数

QFileDialog的成员函数很多,下列罗列最常用的成员函数:

2.1.1静态成员函数(最常用)

getOpenFileName()

功能:弹出标准"打开文件"对话框

参数:父窗口指针、标题、初始目录、文件过滤器

返回:用户选择的单个文件路径(QString

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QString file = QFileDialog::getOpenFileName(this, "打开文件", "/home", "文本文件 (*.txt)");

getSaveFileName()

功能:弹出标准"保存文件"对话框

参数:同上

返回:用户输入的保存路径(QString

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QString savePath = QFileDialog::getSaveFileName(this, "保存文件", "/home/untitled.txt", "PDF文件 (*.pdf)");

getExistingDirectory()

功能:选择目录对话框

参数:父窗口指针、标题、初始目录

返回:选择的目录路径(QString

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QString dir = QFileDialog::getExistingDirectory(this, "选择文件夹", "/home");

getOpenFileNames()

功能:多文件选择对话框

参数:同getOpenFileName()

返回:用户选择的多个文件路径(QStringList

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QStringList files = QFileDialog::getOpenFileNames(this, "选择多个文件", "/home", "图片 (*.png *.jpg)");

2.1.2核心成员函数
  1. 文件模式控制
    • setFileMode(QFileDialog::FileMode) 可选模式:
      • AnyFile:输入任意文件名(用于保存)
      • ExistingFile:选择单个现有文件
      • Directory:仅选择目录
      • ExistingFiles:选择多个现有文件
  2. 过滤器设置
    • setNameFilter(const QString&) 示例:dialog.setNameFilter("文本文件 (*.txt);;CSV文件 (*.csv)");
  3. 对话框行为
    • setAcceptMode(QFileDialog::AcceptMode) 可选模式:
      • AcceptOpen:打开文件模式
      • AcceptSave:保存文件模式
  4. 视图设置
    • setViewMode(QFileDialog::ViewMode) 可选模式:
      • List:简单列表视图
      • Detail:带详细信息的视图

2.1.3实用功能函数
  1. 获取选择结果
    • selectedFiles():返回用户选择的文件路径列表(QStringList
    • selectedNameFilter():返回当前选择的过滤器名称(QString
  2. 路径设置
    • setDirectory(const QString&):设置初始目录
    • setDefaultSuffix(const QString&):设置默认文件后缀(如自动补全.txt
  3. 选项配置
    • setOption(QFileDialog::Option, bool) 常用选项:
      • DontUseNativeDialog:强制使用Qt风格对话框
      • ReadOnly:禁止编辑文件名
      • ShowDirsOnly:仅显示目录

3.实验

3.1实验1【打开存在的文件】

实验目的

打开存在的文件,并读取文件内的内容;

实验代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 主事件循环
}

实验现象

image-20250514134158076
image-20250514134158076
3.2实验二【创建新文件】

实验目的

在文件选择框中,在某一地址下创建一个新的文件,并在文件中写入内容!

实验代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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)
}

实验现象

成功在指定文件路径下的指定文件中写入了指定的内容:

image-20250514135930443
image-20250514135930443
3.3实验三【选择如干个文件】

实验目的

可以一次选择若干个存在的文件,并打印文件的路径

实验代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 替代)
}

实验现象

image-20250514141110861
image-20250514141110861

4.总结

本文我们学习了在QT中如何使用 QFileDialog这一重要的类,并给出详细的示例。

我们明白了文件选择常常和打开文件,操作文件等操作联系在一起,形成一套完整的操作流。

附录

image-20250514141353444
image-20250514141353444
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验