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) 保存到文件。

相关推荐
我是一颗柠檬8 分钟前
【Java项目技术亮点】Leaf号段模式双Buffer优化
java·开发语言·分布式·后端·架构
Cx330❀12 分钟前
【MySQL基础】详解MySQL数据类型:底层原理、越界测试与最佳实践
linux·开发语言·数据库·c++·mysql
星恒随风16 分钟前
C++ string 入门(一)
开发语言·c++·笔记·学习
旖-旎16 分钟前
《LeetCode 200 FloodFill 岛屿数量DFS解法》
c++·算法·深度优先·力扣·floodfill
前进吧-程序员23 分钟前
反转链表完全指南:辅助容器、三指针、头插法
数据结构·c++·链表
程序员三明治25 分钟前
【AI】从文本到向量:理解Embedding的作用
java·人工智能·后端·llm·元数据·rag·向量化
我不是懒洋洋26 分钟前
从零实现一个分布式配置中心:服务发现与热更新
c++
省四收割者28 分钟前
从硬件中断到分布式协程:全景解构高并发机制与 C / Golang 的巅峰对决
c++·分布式·嵌入式硬件·golang
Zyangxsir28 分钟前
RabbitMQ 核心概念以及Java(Spring Boot)实战用法的整理
java·spring boot·后端·rabbitmq·java-rabbitmq