8.Qt文件操作

1.设置布局

1.1选择Text Edit点击垂直布局

1.2 输入文件(&F)

1.3补全文件

1.4补全菜单栏

按下SHIFT+ALT+R可以查看预览图

1.5menubar整个界面,menu菜单栏,action菜单栏下面的功能

将新建改成newAction,打开改成openAction,另存为改成saveAction

2.实现按钮功能

2.1实现newAction功能

(1) mainwindow.h

js 复制代码
private slots:
    void newActionSlot();

(2) mainwindow.cpp

js 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->newAction, &QAction::triggered, this, &MainWindow::newActionSlot);
}


void MainWindow::newActionSlot()
{
    ui->textEdit->clear();
    this->setWindowTitle("新建文本文档.txt");
}

(3) connect连接

参数 说明
ui->newAction 信号发送者(QAction 对象)
&QAction::triggered 信号(QAction 被点击时发出)
this 接收信号的对象(当前窗口)
&MainWindow::newActionSlot 槽函数(点击后执行的函数)

(4) newActionSlot()槽函数

  • ui->textEdit 是界面上的一个文本框(由 Qt Designer 设计)。
  • this 指代当前 MainWindow 对象。

2.2实现openAction功能

(1) Qt文档

(2) Qt代码

js 复制代码
QStringList files = QFileDialog::getOpenFileNames(
                        this,
                        "Select one or more files to open",
                        "/home",
                        "Images (*.png *.xpm *.jpg)");

(3) mainwindow.h

js 复制代码
private slots:
    void openActionSlot();

(4) mainwindow.cpp

js 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

connect(ui->openAction, &QAction::triggered, this, &MainWindow::openActionSlot);
}


void MainWindow::openActionSlot()
{
    // 1. 弹出文件选择对话框,限定打开 `.cpp` 文件
    QString fileName = QFileDialog::getOpenFileName(
        this, 
        "打开", 
        QCoreApplication::applicationFilePath(), 
        "*.cpp"
    );

    // 2. 检查用户是否取消了文件选择
    if (fileName.isEmpty()) {
        QMessageBox::warning(this, "警告", "Please select a file");
    } 
    
    // 3. 如果选择了文件,读取内容并显示在 textEdit 中
    else {
        QFile file(fileName);      // 创建 QFile 对象
        file.open(QIODevice::ReadOnly);  // 以只读模式打开文件
        QByteArray ba = file.readAll();  // 读取全部内容到 QByteArray
        ui->textEdit->setText(QString(ba));  // 转为 QString 并显示在 textEdit
        file.close();  // 关闭文件
    }
}

(5) connect连接

参数 说明
ui->openAction 信号发送者(界面中的 QAction 对象)
&QAction::triggered 信号(当用户点击该动作时触发)
this 接收信号的对象(当前 MainWindow 窗口)
&MainWindow::openActionSlot 槽函数(点击后调用的函数)

(6) 弹出文件选择对话框

使用 QFileDialog::getOpenFileName() 让用户选择文件。

参数说明:

this:父窗口(当前窗口)。

"打开":对话框标题。

QCoreApplication::applicationFilePath():默认打开的目录(程序所在路径)。

"*.cpp":文件过滤器(仅显示 .cpp 文件)。

(7) 检查用户是否取消选择

如果 fileName.isEmpty()true,说明用户点了"取消",弹出警告提示。

(8) 读取文件并显示

使用 QFile 打开文件,读取全部内容到 QByteArray

QByteArray 转为 QString,并设置到 ui->textEdit 显示。

2.3实现saveAction功能

(1) mainwindow.h

js 复制代码
private slots:
    void saveActionSlot();

(2) mainwindow.cpp

js 复制代码
void MainWindow::saveActionSlot()
{
    // 1. 弹出保存文件对话框
    QString fileName = QFileDialog::getSaveFileName(
        this, 
        "打开",  // 对话框标题(建议改为"保存"更贴切)
        QCoreApplication::applicationFilePath()  // 默认保存路径(程序所在目录)
    );

    // 2. 检查用户是否取消保存
    if (fileName.isEmpty()) {
        QMessageBox::warning(this, "警告", "Please select a file");
    } 
    
    // 3. 保存文件
    else {
        QFile file(fileName);          // 创建文件对象
        file.open(QIODevice::WriteOnly); // 以只写模式打开
        QByteArray ba;                 
        ba.append(ui->textEdit->toPlainText()); // 将文本框内容转为字节流
        file.write(ba);                // 写入文件
        file.close();                  // 关闭文件
    }
}

(3)connect 函数

参数 说明
ui->saveAction 信号发送者(界面中的 QAction 对象)
&QAction::triggered 信号(用户点击时触发)
this 接收信号的对象(当前窗口)
&MainWindow::saveActionSlot 槽函数(点击后调用的保存逻辑)

(4) 弹出保存对话框

QFileDialog::getSaveFileName() 让用户选择保存路径和文件名。

参数说明:

this:父窗口。

"打开":建议改为 "保存" 更符合功能语义。

QCoreApplication::applicationFilePath():默认保存到程序所在目录。

(5) 检查用户是否取消

如果 fileName 为空(用户点了取消),弹出警告提示。

(6) 保存文件内容

textEdit 中的文本 (toPlainText()) 转为 QByteArray

以二进制写入模式 (QIODevice::WriteOnly) 保存到文件。

相关推荐
汉克老师13 分钟前
2026年CSP-J初赛分数线-----预测
c++·csp-j·小学生·学c++编程
小保CPP1 小时前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
止语Lab1 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活1 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困1 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn1 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530141 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908401 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金1 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛2 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构