【QT】系统事件入门 -- 文件 QFile基础和示例

06-02 1282阅读

一、Qt 文件概述

🔥 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于⽂件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件制或重命名等

二、输入输出设备类

在 Qt 中,文件读写的类为 QFile

  • QFile 的父类为 QFileDevice,QFileDevice 提供了文件交互操作的底层功能
  • QFileDevice 的父类是 QIODevice,QIODevice 的父类为 QObject
  • QIODevice 是 Qt 中所有输入输出设备(input/output device,简称 I/O 设备)的基础类,I/O 设备就是能进行数据输入和输出的设备
  • 例如文件是⼀种 I/O 设备,网络通信中的 socket 是 I/O 设备,串口、蓝牙等通信接口也是 I/O 设备,所以它们也是从 QIODevice 继承来的。

    Qt 中主要的⼀些 I/O 设备类的继承关系如下图所示:

    【QT】系统事件入门 -- 文件 QFile基础和示例

    名称作用
    QFile用于 文件操作和文件数据读写 的类,使用 QFile 可以读写任意格式的文件。
    QSaveFile用于 安全保存文件 的类。是使用 OSaveFile 保存文件时,它会先把数据写入一个临时文件,成功提交后才将数据写入最终的文件。如果保存过程中出现错误,临时文件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写入部分数据。在保存比较大的文件或复杂格式的文件时可以使用这个类,例如从网络上下载文件等。
    QTemporaryFile用于 创建临时文件 的类。使用函数 QTemporaryFile::open() 就能创建一个文件名唯一的临时文件,在 QTemporaryFile 对象被删除时,临时文件被自动删除
    QTcpSocket
    QUdpSocket
    分别实现了 TCP 和 UDP 的类。
    OSerialPort实现了 串口通信 的类,通过这个类可以实现计算机与串口设备的通信。
    QBluetoothSocket用于 蓝牙通信 的类。手机和平板计算机等移动设备有蓝牙通信模块,笔记本电脑一般也有蓝牙通信模块。通过 QBluetoothSocket 类,就可以编写蓝牙通信程。如编程实现笔记本电脑与手机的蓝牙通信。
    QProcess用于启动外部程序,并且可以给程序传递参数。
    相当于是对 fork / exec 操作进行的封装
    QBuffer以一个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作一个 I/0 设备来读写。
    • 串口:一种比较古老的通信方式,一般是在嵌入式系统上,通过串口和开发板之间进行交互操作

      三、文件读写类

      在 Qt 中,文件的读写主要是通过 QFile 类来实现。在 QFile 类中提供了一些用来读写文件的方法。对于文件的操作主要有:

      • 读数据:QFile 类中提供了多个方法用于读取文件内容;如:read()、readAll()、readLine()等。
      • 写数据:QFile 类中提供了多个方法用于往文件中写内容;如 write()、writeData()等。
      • 关闭文件:文件使用结束后必须用函数 close()关闭文件。

        访问一个设备之前,需要使用 open()函数 打开该设备,而且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QlODevice::OpenMode 枚举变量定义,其取值如下:

        【QT】系统事件入门 -- 文件 QFile基础和示例

        名称说明
        QIODevice::NotOpen没有打开设备
        QIODevice::ReadOnly以 只读 方式打开设备
        QIODevice::WriteOnly以 只写 方式打开设备
        QIODevice::ReadWrite以 读写 方式打开设备
        QIODevice::Append以 追加 方式打开设备,数据写到文件末尾
        QIODevice::Truncate每次打开文件后重写文件内容,原内容将被删除
        QIODevice::Text在读文件时,行尾终止符会被转换为 ‘\n’;当写入文件时,行尾终止符会被转换为本地编码。如:Win32上为 ‘\r\n’;
        QIODevice::Unbuffered无缓冲形式打开文件,绕过设备中的任何缓冲区
        QIODevice::NewOnly文件存在则打开失败,不存在则创建文件

        代码示例

        代码示例1:创建和打开文件

        #include 
        #include 
        #include 
        void createAndWriteFile(const QString &filePath) {
            QFile file(filePath);
            if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
                QTextStream out(&file);
                out 
                qDebug() 
            QFile file(filePath);
            if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                QTextStream in(&file);
                while (!in.atEnd()) {
                    QString line = in.readLine();
                    qDebug() 
                qDebug() 
            ui-setupUi(this);
            this-setWindowTitle("记事本");
            QMenuBar* menuBar = this-menuBar();// 获取到菜单项
            QMenu* menu = new QMenu("文件");// 添加菜单
            menuBar-addMenu(menu);
            QAction* ac1 = new QAction("打开"); // 添加菜单项
            QAction* ac2 = new QAction("保存");
            menu-addAction(ac1);
            menu-addAction(ac2);
            // 指定一个输入框 edit 为全局变量
            edit = new QPlainTextEdit();
            QFont font;
            font.setPixelSize(25);
            edit->setFont(font);
            this->setCentralWidget(edit);
            // 连接 QAction 信号槽
            connect(ac1, &QAction::triggered, this, &MainWindow::handleAction1);
            connect(ac2, &QAction::triggered, this, &MainWindow::handleAction2);
        }
        void MainWindow::handleAction1()
        {
            // 1. 先弹出 "打开文件" 对话框,选择打开文件
            QString path = QFileDialog::getOpenFileName(this);
            // 2. 把文件名显示到状态栏里
            QStatusBar* statusBar = this->statusBar();
            statusBar->showMessage(path);
            // 3. 根据用户选择路径,构造一个 QFile 对象,并且打开文件
            QFile file(path);
            if(!file.open(QIODevice::ReadOnly)){
                // 打开文件失败
                statusBar->showMessage(path + " 打开失败");
                return;
            }
            // 4. 读取文件
            // 这里需要确保打开的文件是文本文件才行
            // 如果是 二进制文件, 交给 QString,
            QString text = file.readAll();
            // 5. 关闭文件,并设置读取内容
            file.close();
            edit->setPlainText(text);
        }
        void MainWindow::handleAction2()
        {
            // 1. 先弹出 "打开文件" 对话框,选择打开文件
            QString path = QFileDialog::getOpenFileName(this);
            // 2. 显示文件名
            QStatusBar* statusBar = this->statusBar();
            statusBar->showMessage(path);
            // 3. 根据用户选择路径,构造一个 QFile 对象,并且打开文件
            QFile file(path);
            if(!file.open(QIODevice::WriteOnly)){
                statusBar->showMessage(path + " 打开失败");
                return;
            }
            // 4. 写文件
            const QString& text = edit->toPlainText();
            file.write(text.toUtf8());
            file.close();
        }
        MainWindow::~MainWindow()
        {
            delete ui;
        }
        

        结果如下:

        【QT】系统事件入门 -- 文件 QFile基础和示例

        四、文件和目录信息类

        QFilelnfo 是 Qt 提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo 类中提供了很多的方法,常用的有:

        方法名称作用
        isDir()检查该文件是否是目录
        isExecutable()检查该文件是否是可执行文件
        fileName()获得文件名
        completeBaseName()获取完整的文件名
        suffix()获取文件后缀名
        completeSuffix()获取完整文件后缀
        size()获取文件大小
        isFile()判断是否为文件
        fileTime()获取文件创建时间、修改时间、最近访问时间等
        #include "widget.h"
        #include "ui_widget.h"
        #include 
        #include 
        #include 
        Widget::Widget(QWidget *parent)
            : QWidget(parent)
            , ui(new Ui::Widget)
        {
            ui->setupUi(this);
            QPushButton* button = new QPushButton("查看文件属性", this);
            connect(button, &QPushButton::clicked, [=](){
               QString path = QFileDialog::getOpenFileName(this);
               QFileInfo fileInfo(path); // 构造对象
               // 打印相关属性
               qDebug() 
            QDir dir;
            if (!dir.exists(dirPath)) {
                if (dir.mkpath(dirPath)) {
                    qDebug() 
                    qDebug() 
                qDebug() 
            QDir dir(dirPath);
            if (dir.exists()) {
                if (dir.rmdir(dirPath)) {
                    qDebug() 
                    qDebug() 
                qDebug() 
        public:
            FileSelector() {
                QPushButton *button = new QPushButton("选择文件", this);
                QVBoxLayout *layout = new QVBoxLayout(this);
                layout-addWidget(button);
                
                // 点击按钮时打开文件选择器
                connect(button, &QPushButton::clicked, this, &FileSelector::selectFile);
            }
        private slots:
            void selectFile() {
                QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("所有文件 (*.*);;文本文件 (*.txt)"));
                
                if (!fileName.isEmpty()) {
                    QMessageBox::information(this, tr("选择的文件"), fileName);
                }
            }
        };
        int main(int argc, char *argv[]) {
            QApplication app(argc, argv);
            FileSelector window;
            window.setWindowTitle("文件选择示例");
            window.resize(300, 100);
            window.show();
            
            return app.exec();
        }
        
        public:
            FolderSelector() {
                QPushButton *button = new QPushButton("选择文件夹", this);
                QVBoxLayout *layout = new QVBoxLayout(this);
                layout-addWidget(button);
                
                // 点击按钮时打开文件夹选择器
                connect(button, &QPushButton::clicked, this, &FolderSelector::selectFolder);
            }
        private slots:
            void selectFolder() {
                QString folderName = QFileDialog::getExistingDirectory(this, tr("选择文件夹"), "");
                if (!folderName.isEmpty()) {
                    QMessageBox::information(this, tr("选择的文件夹"), folderName);
                }
            }
        };
        int main(int argc, char *argv[]) {
            QApplication app(argc, argv);
            FolderSelector window;
            window.setWindowTitle("文件夹选择示例");
            window.resize(300, 100);
            window.show();
            
            return app.exec();
        }
        
            for (const QString &fileName : fileNames) {
                // 处理每个文件
                qDebug() 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码