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

Qt系统相关——QFile和QFileInfo

文章目录

    • 文件操作
    • QFile
    • 使用示例
    • QFileInfo

文件操作

C语言:

  • fopen打开文件
  • freadfwrite读写文件
  • fclose关闭文件

C++:

  • fstream打开文件
  • <<>>流式操作符读写

Linux:

  • open打开文件
  • readwrite读写文件
  • close关闭文件

Qt自己也提供了一套文件操作,同时也兼任上述的方案,但如果要编写Qt程序,还是建议使用Qt提供的文件操作方案。

Qt诞生的太早了,那会C++还没有标准

image-20240923192742013

QFile还派生出一个子类QTemporaryFile,表明一个临时文件,对象销毁,对应文件就自动删除了

QFile

QFile提供了一些操作文件的成员函数:

  • 构造

    QFile(const QString &name, QObject *parent)
    QFile(QObject *parent)
    QFile(const QString &name)
    QFile()
    virtual ~QFile()
    
  • open打开文件

    //比较原生
    bool open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
    bool open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
    //重写虚函数
    virtual bool open(QIODevice::OpenMode mode) override
    

    OpenMode表明指定哪种方式打开:

    image-20240923194112897

  • read/readLine/readAll读取文件

    qint64 read(char *data, qint64 maxSize)
    QByteArray read(qint64 maxSize)
    QByteArray readAll()
    qint64 readLine(char *data, qint64 maxSize)
    QByteArray readLine(qint64 maxSize = 0)
    
  • write写入文件

    qint64 write(const char *data, qint64 maxSize)
    qint64 write(const char *data)
    qint64 write(const QByteArray &byteArray)
    
  • close关闭文件

    virtual void close()
    

使用示例

实现一个程序,点击窗口里的打开,弹出打开文件的对话框,选择文件,将内容显示到输入框;点击窗口里的保存,将输入框内容写入文件。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QPlainTextEdit>

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    void handleAction1();
    void handleAction2();
private:
    Ui::MainWindow *ui;
    QPlainTextEdit* edit;
};
#endif // MAINWINDOW_H

初始化部分:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //获取菜单栏
    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::handleAction1);
    connect(action2, &QAction::triggered, this, &MainWindow::handleAction2);
}

打开文件:

void MainWindow::handleAction1()
{
    //弹出“打开文件”对话框   选择打开文件
    QString path = QFileDialog::getOpenFileName(this);
    
    //文件名显式到状态栏
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);
    
    //根据选择路径    构造QFile对象
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly))
    {
        statusBar->showMessage(path + "打开文件失败");
        return;
    } 
    
    //读取文件
    QString text = file.readAll();
    
    //关闭文件
    file.close();
    
    //读取到的内容, 输入到输入框当中
    edit->setPlainText(text);
}

QString重载了=

image-20240923201127064

但是这里需要确保打开的文件是文本文件

保存文件:

void MainWindow::handleAction2()
{
    //弹出“保存文件”对话框
    QString path = QFileDialog::getSaveFileName(this);
    //在状态栏显式文件名
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);
    //根据选路径 构造QFile对象   通过写的方式
    QFile file(path);
    if(!file.open(QIODevice::WriteOnly))
    {
        statusBar->showMessage(path + "打开文件失败");
    }
    //读取输入框内容
    const QString& text = edit->toPlainText();
    //写入文件
    file.write(text.toUtf8());
    //关闭文件
    file.close();
}

直接写入会报错,类型不匹配,可以转成utf8,返回类型是QByteArray

image-20240923202216877

GIF 2024-9-23 20-28-55


GIF 2024-9-23 20-30-27

QFileInfo

QFileInfo可以获取到Qt的文件的相关属性(文件名、文件路径、文件后缀等)

类似这样的功能在C/C++标准库本来是没有的;

C++17引入了filesystem,可以获取文件的相关属性。

#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog>
#include<QDebug>
#include<QFileInfo>
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对象
    QFileInfo fileInfo(path);
    //打印相关属性
    qDebug() << fileInfo.fileName();
    qDebug() << fileInfo.suffix();  //文件后缀
    qDebug() << fileInfo.path();
    qDebug() << fileInfo.size();
    qDebug() << fileInfo.isFile();
    qDebug() << fileInfo.isDir();
}

GIF 2024-9-23 20-45-26


http://www.kler.cn/a/321993.html

相关文章:

  • 笔记整理—内核!启动!—linux应用编程、网络编程部分(5)系统时间与信息
  • Django 依赖库管理
  • 【计网】从零开始掌握序列化 --- 基础知识储备与程序重构
  • Ubuntu24.04下安装Budgie桌面的注意事项
  • 【C++掌中宝】深入理解函数重载:概念、规则与应用
  • Map和Set,TreeMap和TreeSet,HashMap和HashSet
  • Docker安装和配置MySQL 5.7的完整指南
  • 【Unity与数据库01】开发者如何选择数据库
  • 深度学习:(五)初识神经网络
  • Unity2022.3.x各个版本bug集合及推荐稳定版本
  • 使用jQuery处理Ajax
  • kotlin——设计模式之责任链模式
  • 数据结构之二叉树(1)
  • 本地生活服务项目揭秘!谁搭建的本地生活服务商作业系统收益效果好?
  • 使用ELK Stack进行日志管理和分析:从入门到精通
  • JDK7和JDK8中的HashMap有什么区别?
  • 初学51单片机之I2C总线与E2PROM
  • Java 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)
  • 【小bug】使用 RestTemplate 工具从 JSON 数据反序列化为 Java 对象时报类型转换异常
  • git 清除二进制文件的 changes 状态