Qt——文件操作

QFile

相关成员方法:

构造:

cpp 复制代码
QFile::QFile(const QString &name)

打开:

cpp 复制代码
[since 6.3] bool QFile::open(QIODeviceBase::OpenMode mode, QFileDevice::Permissions permissions)

OpenMode:

Permissinos:

读:

cpp 复制代码
qint64 QIODevice::read(char *data, qint64 maxSize)

QByteArray QIODevice::read(qint64 maxSize)

qint64 QIODevice::readLine(char *data, qint64 maxSize)

QByteArray QIODevice::readLine(qint64 maxSize = 0)

QByteArray QIODevice::readAll()

写:

cpp 复制代码
qint64 QIODevice::write(const char *data, qint64 maxSize)

qint64 QIODevice::write(const char *data)

qint64 QIODevice::write(const QByteArray &data)

关闭:

cpp 复制代码
[virtual] void QIODevice::close()

例如:制作一个简易的记事本

cpp 复制代码
// mainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPlainTextEdit>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

   public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void saveHandler();
    void openHandler();
    void fontHandler();

   private:
    Ui::MainWindow *ui;

    QPlainTextEdit *plain_text_edit_ = nullptr;
};
#endif  // MAINWINDOW_H

// mainWindow.cpp
#include "mainwindow.h"

#include <QDebug>
#include <QFileDialog>
#include <QFontDialog>

#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);

    this->setWindowTitle("记事本");

    // 获取菜单栏
    QMenuBar* menuBar = this->menuBar();

    // 添加菜单
    QMenu* menu = new QMenu("文件 (&F)");
    menuBar->addMenu(menu);

    // 添加菜单项
    QAction* act1 = new QAction("Open");
    QAction* act2 = new QAction("Save");
    QAction* act3 = new QAction("Font");
    act1->setShortcut(Qt::CTRL | Qt::Key_O);
    act2->setShortcut(Qt::CTRL | Qt::Key_S);
    act3->setShortcut(Qt::CTRL | Qt::Key_F);
    menu->addAction(act1);
    menu->addAction(act2);
    menuBar->addAction(act3);

    // 向主窗口添加纯文本编辑器
    plain_text_edit_ = new QPlainTextEdit();
    this->setCentralWidget(plain_text_edit_);

    // 给保存和打开菜单项关联信号槽
    connect(act1, &QAction::triggered, this, &MainWindow::openHandler);
    connect(act2, &QAction::triggered, this, &MainWindow::saveHandler);
    connect(act3, &QAction::triggered, this, &MainWindow::fontHandler);
}

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

void MainWindow::openHandler() {
    QString path = QFileDialog::getOpenFileName(this);

    QFile file(path);
    if (!file.open(QIODeviceBase::ReadOnly)) {
        qDebug() << path << " 打开失败";

        return;
    }

    // 获取状态栏
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);

    QString text = file.readAll();
    plain_text_edit_->setPlainText(text);

    file.close();
}

void MainWindow::saveHandler() {
    QString path = QFileDialog::getSaveFileName(this);
    QFile file(path);
    if (!file.open(QIODeviceBase::WriteOnly)) {
        qDebug() << path << " 打开失败";

        return;
    }

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

    QString text = plain_text_edit_->toPlainText();
    file.write(text.toUtf8());

    file.close();
}

void MainWindow::fontHandler() {
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    if (ok) {
        plain_text_edit_->setFont(font);
    }
}

FileInfo 文件目录信息类

通过这个类,我们可以获取到文件的相关属性。

常用的方法有:

  • isDir() 检查该文件是否是目录;
  • isExecutable() 检查该文件是否是可执行文件;
  • fileName() 获得文件名;
  • completeBaseName() 获取完整的文件名;
  • suffix() 获取文件后缀名;
  • completeSuffix() 获取完整的文件后缀;
  • size() 获取文件大小;
  • isFile() 判断是否为文件;
  • fileTime() 获取文件创建时间、修改时间、最近访问时间等;

例如:

cpp 复制代码
#include "widget.h"

#include <QDebug>
#include <QFileDialog>
#include <QFileInfo>

#include "./ui_widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); }

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

void Widget::on_pushButton_clicked() {
    QString path = QFileDialog::getOpenFileName(this);
    QFileInfo info(path);

    qDebug() << info.isFile()                               // 是否为文件
             << info.isDir()                                // 是否为目录
             << info.isExecutable()                         // 是否为可执行程序
             << info.size()                                 // 文件大小
             << info.fileName()                             // 文件名称
             << info.fileTime(QFileDevice::FileBirthTime);  // 文件创建时间
}
相关推荐
h39744 小时前
DirectShow过滤器开发-视频源过滤器
c++·windows·音视频·directshow
夏幻灵6 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码6 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
西飘客7 小时前
vs 怎么根据dll 生成lib文件
c++·qt
bkspiderx7 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光8 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园8 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西9 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨9 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言