当前位置: 首页 > news >正文

Qt的文件操作

Qt的文件操作

由于 Qt 的发展比较早,在 C++ 尚未提供标准的文件流操作时,Qt 就研发出了自己的文件操作并沿用至今。Qt 提供了丰富的文件操作类,包括 QFile 文件操作和读写类以外,还有 QSaveFile(安全文件保存类)、QTemporaryFile(临时文件类)、QTcpSocket(TCP 类)、QUdpSocket(UDP类)、QSerialPort(串口通信类)、QBluetoothSocket(蓝牙通信类)、QProcess(进程通信类)、QBuffer(文件缓冲区类)等。

1. 常用文件操作接口

1.1 打开文件

函数说明
virtual bool open(QIODevice::OpenMode mode) override这个接口可以使用于不同文件操作逻辑的操作系统间。

1.2 读文件

函数说明
qint64 read(char *data, qint64 maxSize)将文件数据读取到指定的字符数组中,最多读取 maxSize 个字节,返回实际读取的字节数。
QByteArray read(qint64 maxSize)从文件中读取最多 maxSize 个字节的数据,并返回一个包含读取内容的 QByteArray 对象。
QByteArray readAll()这个接口不需要关心读取文件的大小和越界,一次会将文件内容都读完。
qint64 readLine(char *data, qint64 maxSize)这个接口提供了读取一行的方法。
QByteArray readLine(qint64 maxSize = 0)读取一行数据并返回 QByteArray 对象;如果 maxSize 非零,则最多读取 maxSize 个字节。

1.3 写文件

注意文本写入文件时,接口可能要指定编码格式,如 ->text().toUtf8()

函数说明
qint64 write(const char *data, qint64 maxSize)将指定字符数组中的数据写入文件,写入的字节数由 maxSize 指定,返回实际写入的字节数。
qint64 write(const char *data)将以 null 结尾的字符串数据写入文件,返回写入的字节数。
qint64 write(const QByteArray &byteArray)QByteArray 中的数据写入文件,返回写入的字节数。

2. 制作简易文本编辑器

虽然 readAll() 的返回值类型是一个 QByteArray ,但 QString 有一个参数为 QByteArray 的构造函数,可以根据隐式类型转换直接赋值。注意为了让 QPlainTextEdit 类型的对话框能够在槽函数中直接调用,将它声明为了一个成员函数。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QFileDialog>
#include <QFile>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //先设置菜单
    this->setWindowTitle("记事本");
    QMenuBar* menuBar=this->menuBar();

    QMenu* menu= new QMenu("文件");
    menuBar->addMenu(menu);

    QAction* action1 =new QAction("打开");
    QAction* action2 =new QAction("保存");

    menu->addAction(action1);
    menu->addAction(action2);
    /*---------------------------------------*/
    //构建一个文本框覆盖整个窗口,并设置字体大小(因为默认字体太小了)
    edit=new QPlainTextEdit();//成员变量
    QFont font;
    font.setPixelSize(20);
    edit->setFont(font);
    this->setCentralWidget(edit);
    /*---------------------------------------*/

    //绑定打开和保存文件的槽函数
    connect(action1,&QAction::triggered,this,&MainWindow::handlerOpen);
    connect(action2,&QAction::triggered,this,&MainWindow::handlerSave);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handlerOpen()
{
    //弹出 “打开文件” 对话框,选择打开什么文件
    QString path = QFileDialog::getOpenFileName(this);

    //向底部状态栏添加打开文件的名称,或提示打开文件失败
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);

    QFile file(path);
    if(!file.open(QFile::ReadOnly))
    {
        statusBar->showMessage("打开失败!");
        return;
    }

    //QString 提供了ByteArray的构造
    QString text = file.readAll();
    file.close();

    edit->setPlainText(text);
}

void MainWindow::handlerSave()
{
    //弹出 “保存文件” 对话框,选择在哪里保存文件
    QString path = QFileDialog::getSaveFileName(this);

    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);

    QFile file(path);
    if(!file.open(QFile::WriteOnly))
    {
        statusBar->showMessage("打开失败!");
        return;
    }
    const QString& text=edit->toPlainText();
    //注意这里要确定写入的编码格式
    file.write(text.toUtf8());

    file.close();
}

QFile1

可以打开文本文件,也可以保存自己写的内容到指定位置的文件中。

3. 文件信息

QFileInfo 类可以获取到文件的相关信息。可以使用 QFileDialog::getOpenFileName(this) 获取到一个文件的路径,在使用 QFileInfo 的构造函数将路径传入,就能获取到路径目标文件的文件信息,包括文件名、文件大小、相对路径、绝对路径等,详细请查 Qt 助手。

相关文章:

  • Linux <(...) 进程替换
  • 【STM32】编写程序控制开发板的RGB LED灯
  • STM32单片机uCOS-Ⅲ系统12 CPU利用率与堆栈检测
  • [plugin:vite:import-analysis] Cannot find module ‘vuex\dist\vuex.esm-bundler
  • 风光互补智慧路灯的灯杆设计有哪些要求?
  • 服务器数据恢复—Raid5热备盘同步中断的数据恢复案例
  • WinSCP使用教程:(SFTP、SCP、FTP 和 WebDAV)
  • CES Asia 2025:科技企业出海的领航灯塔
  • 如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志
  • 数据库 第一章 MySql基础(2)
  • STL之map和set
  • Altium Designer——PCB设计(走线与布局前的准备)
  • WebWorkers在项目中的使用案例
  • 状态模式(State Pattern)
  • 识货APP sh-sign sh-ba sh-jt 分析
  • qt QQuaternion详解
  • Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)
  • 2025-03-26 学习记录--C/C++-PTA 6-2 顺序表操作集
  • SSML(Speech Synthesis Markup Language)简介
  • 视频前后景分离
  • 以色列计划“占领加沙”,特朗普下周中东行结束之际将是“机会窗口”
  • 特朗普称不会为了和中国谈判而取消对华关税,外交部回应
  • 非洲中青年军官代表团访华,赴北京、长沙、韶山等地参访交流
  • 沙发上躺赢又如何?告别冠军绝缘体的凯恩,要开始收割荣誉了
  • 杨德龙:取得长期投资胜利法宝,是像巴菲特一样践行价值投资
  • 南京明孝陵石兽遭涂鸦“到此一游”,景区:已恢复原貌,警方在排查