【嵌入式Qt开发入门】如何使用Qt进行文本读写——QFile读写文本

news2024/10/6 10:38:26

        在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本文介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。

QFile 读写文本

        QFile 类提供了读取和写入文件的接口。在嵌入式里如果需要读写文件,最简单的方法就是 用 Qfile,例如利用QFile来读写 Linux 下的字符设备(可把字符设备当作一个文本处理,linux 下一切皆文件),虽然只是写‘0’或‘1’,但也是对文件(文本)的读写了。

        QFile 是一个读写文本、二进制文件和资源的 I/O 设备。QFile 可以自己使用,也可以更方便地与 QTextStream 或 QDataStream 一起使用。

        文件名通常在构造函数中传递,但它可以在任何时候使用 setFileName()设置。不支持使用其他分隔符(例如'\')。所以在 Windows、Linux 或者 Mac 里文件的路径都是用'/'。不能看到 Windows 的路径是'\',我们就可以在写入的文件路径里添加这个'\'。不管操作系统是什么,QFile 的文件分隔符都是'/'。

        可以使用 exists()检查文件是否存在,并使用 remove()删除文件。(更高级的文件系统相关操 作由 QFileInfo 和 QDir 提供)用 open()打开文件,用 close()关闭文件,用 flush()刷新文件。通常使用 QDataStream 或 QTextStream 读写数据,但也可以调用 QIODevice 继承的函数 read()、 readLine()、readAll()、write()。QFile 还继承 getChar()、putChar()和 ungetChar(),它们一次只处 理一个字符。文件的大小由 size()返回。可以使用 pos()获取当前文件位置,也可以使用 seek() 移动到新的文件位置。如果已经到达文件的末尾,则 atEnd()返回 true。

        QFile::open()函数打开文件时需要传递 QIODevice::OpenModeFlag 枚举类型的参数,决定 文件以什么方式打开,QIODevice::OpenModeFlag 类型的主要取值如下:

  • QIODevice::ReadOnly:以只读方式打开文件,用于载入文件。
  • QIODevice::WriteOnly:以只写方式打开文件,用于保存文件。
  • QIODevice::ReadWrite:以读写方式打开。
  • QIODevice::Append:以添加模式打开,新写入文件的数据添加到文件尾部。
  • QIODevice::Truncate:以截取方式打开文件,文件原有的内容全部被删除。
  • QIODevice::Text:以文本方式打开文件,读取时“\n”被自动翻译为换行符,写入时字符 串结束符会自动翻译为系统平台的编码,如 Windows 平台下是“\r\n”。

        这些取值可以组合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读和文本方式打开文件。

        使用 QFile 对一个文本文件的操作流程是以下这样的。

应用实例

        创建项目qfile_test,在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QFile>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    /* 用于读取文件后显示 */
    QTextEdit *textEdit;
    /* QFile 类型对象 */
    QFile file;
    /* 布局 */
    QHBoxLayout *hBoxLayout;
    QVBoxLayout *vBoxLayout;
    QWidget *hWidget;
    QWidget *vWidget;
    /* 打开文件按钮 */
    QPushButton *openPushButton;
    /* 关闭文件按钮 */
    QPushButton *clsoePushButton;
private slots:
    /* 打开文本文件 */
    bool openFile();
    /* 关闭文本文件 */
    void closeFile();
};
#endif // MAINWINDOW_H

        在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"
#include <QFileDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 设置窗口的位置与大小 */
    this->setGeometry(0, 0, 800, 480);
    /* 布局设置 */
    textEdit = new QTextEdit();
    vBoxLayout = new QVBoxLayout();
    hBoxLayout = new QHBoxLayout();
    vWidget = new QWidget();
    hWidget = new QWidget();
    openPushButton = new QPushButton();
    closePushButton = new QPushButton();
    /* 设置两个按钮的大小 */
    openPushButton->setMinimumHeight(50);
    openPushButton->setMaximumWidth(120);
    closePushButton->setMinimumHeight(50);
    closePushButton->setMaximumWidth(120);
    /* 设置两个按钮的文本 */
    openPushButton->setText("打开");
    closePushButton->setText("关闭");
    /* 设置关闭按钮为不可用属性,需要打开文件才设置为可用属性 */
    closePushButton->setEnabled(false);
    /* 水平布局 */
    hBoxLayout->addWidget(openPushButton);
    hBoxLayout->addWidget(closePushButton);
    hWidget->setLayout(hBoxLayout);
    /* 垂直布局 */
    vBoxLayout->addWidget(textEdit);
    vBoxLayout->addWidget(hWidget);
    vWidget->setLayout(vBoxLayout);
    /* 居中 */
    setCentralWidget(vWidget);
    /* 信号槽连接 */
    connect(openPushButton, SIGNAL(clicked()), this, SLOT(openFile()));
    connect(closePushButton, SIGNAL(clicked()), this, SLOT(closeFile()));
}

MainWindow::~MainWindow()
{
}

bool MainWindow::openFile(){
    /* 获取文件的路径 */
    QString fileName = QFileDialog::getOpenFileName(this);
    /* 指向文件 */
    file.setFileName(fileName);
    /* 判断文件是否存在 */
    if(!file.exists())
        return false;
    /* 以读写的方式打开 */
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return false;
    /* 读取文本到 textEdit */
    textEdit->setPlainText(file.readAll());
    /* 设置打开按钮不可用,需要关闭再打开 */
    openPushButton->setEnabled(false);
    /* 设置关闭按钮为可用属性 */
    closePushButton->setEnabled(true);
    /* 关闭文件 */
    file.close();
    return true;
}
void MainWindow::closeFile(){
    /* 检测打开按钮是否可用,不可用时,说明已经打开了文件 */
    if(!openPushButton->isEnabled()){
        /* 获取 textEdit 的文本内容 */
        QString str = textEdit->toPlainText();
        /* 以只读的方式打开 */
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
               return;
        /* 转换为字节数组 */
        QByteArray strBytes = str.toUtf8();
        /* 写入文件 */
        file.write(strBytes, strBytes.length());
        /* 清空 textEdit 的显示内容 */
        textEdit->clear();
        /* 关闭文件 */
        file.close();
        /* 重新设置打开和关闭按钮的属性 */
        openPushButton->setEnabled(true);
        closePushButton->setEnabled(false);
    }
}

程序运行效果

        点击打开 

         调用系统打开文件的窗口。选择一个文本文件。

         打开后,文本的内容如下,可以进行修改,修改后点击关闭就会写入到此文件里。本例仅仅用两个按钮和一个文本编辑框完成,内容简洁易懂。但是在实际项目里不是用 QPushButton 来做打开文件和关闭文件的,一般设计于在菜单栏里用 QAction 来做。包括添加复制、粘贴、 另存为、关闭、等等。可以仿照 Windows 里的记事本,用 Qt 写一个类似的软件完全可以。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 内核的学习

一、启动流程 二、进程调度 进程 进程控制块&#xff08;pid&#xff09;结构体 重要的信息 进程标识符 pid 状态&#xff1a;任务状态 优先级&#xff1a;相对其他进程 程序计数器&#xff1a;程序中即将被执行的下一条指令的地址 内存指针&#xff1a;包括程序代码…

echarts 柱状体点击空白处

点击红框里的空白区域&#xff1a; 再data里定义的idlist变量:idList: [800, 300, 500, 400, 800, 300, 500, 400, 800, 300, 500, 400, 800, 300,500, 400, 800, 300, 500, 400,]//以下是js代码var chartDom document.getElementById(echartsOne)this.myChart echarts.init…

数据产品经理的职业发展机会

在当今的数字时代&#xff0c;数据产品经理已成为许多企业中不可或缺的角色。随着越来越多的企业开始将数据应用于业务决策和产品开发中&#xff0c;数据产品经理的需求也不断增加。因此&#xff0c;学习成为一名数据产品经理成为了许多人的热门选择。下面说一说关于如何学习数…

tty(imx serial)(二)

基于linux-3.14.16 基于imx分析 一、串口设备注册 注册了一个uart设备驱动&#xff0c;和一个平台设备驱动 先一个一个看 1、serial_imx_driver平台设备驱动 看看匹配的设备树&#xff0c;imx6qdl.dtsi定义了很多&#xff0c;我们只看一个 如上图&#xff0c;设备树描述了…

基于 RK3399+fpga 的 VME 总线控制器设计(二)硬件和FPGA逻辑设计

3.2 FPGA 最小系统设计 FPGA 最小系统是指可以使 FPGA 正常工作的最基本的系统&#xff0c;主要包括电源电 路、配置电路、时钟和复位电路。本次设计使用的 FPGA 为紫光同创的 PG2L100H, 接下来具体介绍 FPGA 最小系统各个部分的电路设计。 &#xff08; 1 &#…

RflySim平台——高可信度的无人控制系统开发、测试与评估平台

01/RflySim平台背景 智能无人系统是一个复杂系统&#xff0c;涉及机械、控制、计算机、通信和材料等多个领域技术&#xff0c;而AI无疑是开发IUS所需的关键技术之一。随着新一代人工智能兴起&#xff0c;我们正面临一场新的工业革命&#xff0c;人类创造了各种无人系统&#x…

论文解读|点云分割中用于多尺度处理的金字塔结构

原创 | 文 BFT机器人 01 论文内容 这篇论文是关于点云分割中金字塔架构的多尺度处理的详细解读。 点云数据的语义分割是自动驾驶和其他应用中的关键任务。在这项工作中&#xff0c;作者指出了在点云分割中移动U形结构的紧迫需求和巨大好处&#xff0c;并受到图像分割领域最新进…

Fleet Farm EDI 需求详解

Fleet Farm 是一家成立于1955年的美国卖场&#xff0c;总部位于威斯康星州。作为一个全方位的零售商&#xff0c;Fleet Farm 提供了广泛的商品和服务&#xff0c;涵盖了农业用品、家居装饰、户外用品、汽车用品、园艺用品等多个领域。他们的使命是为客户提供高品质的产品和卓越…

《阿里大数据之路》读书笔记:第二章 日志采集

第二章 日志采集 一、浏览器的页面日志采集 浏览器的页面型产品/服务的日志采集可分为两大类&#xff1a; 页面浏览&#xff08;展现&#xff09;日志采集 指一个页面被浏览器加载呈现时采集的日志 此类日志是最基础的互联网日志 此类日志是目前所有互联网产品的两大基本指…

【Linux】LVS负载均衡群集 NAT模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LVS负载均衡群集 NAT模式 一、理解负载均衡群集的原理1.企业群集应用概述2.企业群集分类3.负载均衡群集架构4.负载均衡群集工作模式分析5.NAT模式6.TUN模式7.DR模式 二、LVS虚…

ESP32 BLE蓝牙服务端客户端通信

官方帮助见这里 BLE服务端命令 ATRESTORE//复位 ATBLEINIT2 //将esp32设置成蓝牙SERVER ATBLEGATTSSRVCRE //GATTS创建服务, 建议初始化后就建立GATTS, 建立连接在创建会报错 ATBLEGATTSSRVSTART //GATTS 开启全部服务。 ATBLEGATTSCHAR? //GATTS 发现服务特征 ATBLEADDR…

回收站的文件删除了怎么恢复?实用的2个方法推荐!

我一直以为回收站里的文件都是我自己删除的文件&#xff0c;因此没有怎么在意。但是我刚刚清空了回收站&#xff0c;却发现我有些重要的文件是被误删而放入回收站的&#xff0c;现在这些文件都被删除了&#xff0c;这可怎么办&#xff1f; 回收站中通常会存放很多我们删除的文件…

使用QT: ActiveX控件生成文件,实现在QT项目中调用.c文件

以连接的其他控件为例&#xff0c;控件的位数&#xff08;32/64&#xff09;&#xff0c;需要和QT编译器保持一致 我在此处连接的是.h和.c文件的类接口&#xff0c;在QT中使用 原始接口&#xff1a; 1.在QT程序中添加模块 QT axcontainer2.查看COM控件的UUID 打开一个.ui文件…

Java基础-多线程JUC-生产者和消费者

1. 生产者与消费者 实现线程轮流交替执行的结果&#xff1b; 实现线程休眠和唤醒均要使用到锁对象&#xff1b; 修改标注位&#xff08;foodFlag&#xff09;&#xff1b; 代码实现&#xff1a; public class demo11 {public static void main(String[] args) {/*** 需求&#…

java jvm TLAB是什么?指针碰撞解释,空闲列表解释

1. 对象的创建&#xff1a; 当Java虚拟机遇到一条字节码new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加载过程…

SpringBoot 实现审核功能

一、审核功能实现的方式 1、普通 方案&#xff1a;经办时入A表&#xff0c;审核后从A表读取数据&#xff0c;然后操作目标B表&#xff1b; 优势&#xff1a;思路简单 劣势&#xff1a;对后端功能实行高度的嵌入&#xff1b;审核功能数据操作不统一 2、弹框式 方案&#x…

HummerRisk 配置 HTTPS访问

简介 HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生的安全和治理问题。核心能力包括混合云的安全治理和云原生安全检测。 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密和身份验证来保护网络通信安全的协议。它…

ChatGPT对高等教育的可能影响与对策建议

ChatGPT来袭&#xff0c;将对高等教育带来哪些影响&#xff0c;我们又该如何应对&#xff1f; 对于ChatGPT&#xff0c;有人欢喜有人忧&#xff0c;不同人、不同领域评价不一。在一些人眼里&#xff0c;它就是天使&#xff0c;而在另外一些人眼里&#xff0c;它几乎可以说是魔…

php导出pdf

插件官网&#xff1a;TCPDF 博主用的是tp6框架 、tcpdf插件 composer require tecnickcom/tcpdf --ignore-platform-reqs 后面是忽略平台要求的参数 ---------------中文乱码start------------------ 关于中文乱码问题&#xff1a; 网上说的下载字体放入fonts 利用tools…

Linux之系统管理

系统管理 Linux中的进程和服务 计算机中&#xff0c;一个正在执行的程序或命令&#xff0c;被叫做“进程”&#xff08;process&#xff09;。 启动之后一直存在、常驻内存的进程&#xff0c;一般被称作“服务”&#xff08;service&#xff09; service 服务管理&#xff…