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);  // 文件创建时间
}
相关推荐
LIZhang201614 小时前
基于ffmpeg8.0录制mp4文件
开发语言·c++
_OP_CHEN14 小时前
C++进阶:(九)深度剖析unordered_map 与 unordered_set容器
开发语言·c++·stl容器·哈希表·哈希桶·unordered_map·unordered_set
七夜zippoe14 小时前
Java并发编程基石:深入理解JMM(Java内存模型)与Happens-Before规则
java·开发语言·spring·jmm·happens-before
Mark Studio15 小时前
QT linux 静态编译问题记录
开发语言·qt
freedom_1024_15 小时前
LRU缓存淘汰算法详解与C++实现
c++·算法·缓存
无敌最俊朗@15 小时前
C++-Qt-音视频-基础问题01
开发语言·c++
折戟不必沉沙15 小时前
C++四种类型转换cast,其在参数传递时的作用
c++
kyle~15 小时前
C++---万能指针 void* (不绑定具体数据类型,能指向任意类型的内存地址)
开发语言·c++
MediaTea15 小时前
Python 第三方库:TensorFlow(深度学习框架)
开发语言·人工智能·python·深度学习·tensorflow
誰能久伴不乏15 小时前
Linux 进程通信与同步机制:共享内存、内存映射、文件锁与信号量的深度解析
linux·服务器·c++