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

        在很多时候我们需要读写文本文件进行读写,比如写个 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_OBJECTpublic: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.hqwc.cn/news/7813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb 速通HTML(常用标签汇总及演示)

目录 一、拾枝杂谈 1.网页组成 : 1 结构 2 表现 3 行为 2.HTML入门 : 1 基本介绍 2.基本结构 : 3.HTML标签 : 1 基本说明 2 注意事项 二、常用标签汇总及演示 1.font标签 : 1 定义 2 演示 2.字符实体 : 1 定义 2 演示 3.标题标签 : 1 定义 2 演示 4. 超链接标签 : 1…

2023年07月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年07月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

【CSS】定位

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;HTMLCSS &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 标准流&#xff08;Normal Flow&#xff09;元素定位position属性静态定位-static…

Squid代理服务器应用

目录 一、概述 1.代理的工作机制 2.代理服务器的概念 3.作用 4.Squid代理类型 二、安装 Squid 服务 1.编译安装 Squid 2.修改 Squid 的配置文件 3. Squid 的运行控制 4.Squid 服务自动化管理 4.1编写 squid 服务脚本 4.2加入系统服务 三、构建传统代理服务器 1.修…

迈瑞BC系列出图汇总

迈瑞的几个仪器出图需要画图&#xff0c;搞的很费劲&#xff0c;没办法&#xff0c;厂商自己不改&#xff0c;明明有图发Base64串的&#xff0c;就非两个图要自己画&#xff0c;画的方法又描述不清。每个LIS厂商都要浪费很多时间&#xff0c;没什么必要浪费在这种没意义的事情上…

对于大连企业而言如何提升网站的曝光率

对于大连企业而言&#xff0c;提升网站的曝光率是非常重要的&#xff0c;可以通过以下几种方式来实现&#xff1a; 1. 优化网站结构和内容&#xff1a;确保网站的结构清晰&#xff0c;布局合理&#xff0c;并且内容丰富、有吸引力。网站的页面加载速度也要快&#xff0c;以提升…

windows 如何ping ip 加端口号

先在系统中找到 勾选上 和平时的pingip命令不一样了 现在是telnet ip 端口号 先看一组无法ping通端口号的案例 若telnet 127.0.0.1 6379 跳转至一个空白界面 代表ping此ip的端口号成功

JMeter安装RabbitMQ测试插件

目录 前言&#xff1a; 具体实现步骤&#xff1a; 1、ant环境搭建 2、AMQP源码下载 3、拷贝JMeter_core.jar包到JMeter-Rabbit-AMQP插件根目录下 4、修改AMQP插件的配置文件 5、打包 6、RabbitMQ客户端插件下载 7、完成以上&#xff0c;重启JMeter创建线程组就可以看到…

Python 数据类型转换

文章目录 每日一句正能量前言隐式类型转换实例实例 显式类型转换实例实例实例实例 每日一句正能量 在人生的道路上&#xff0c;即使一切都失去了&#xff0c;只要一息尚存&#xff0c;你就没有丝毫理由绝望。因为失去的一切&#xff0c;又可能在新的层次上复得。 前言 有时候&…

Unity与Android交互(4)——接入SDK

【前言】 unity接入Android SDK有两种方式&#xff0c;一种是把Unity的工程导出google project的形式进行接入&#xff0c;另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。 对我们接入SDK的人来说&#xff0c;SDK也是…

谷歌浏览器Crx插件库-https://crxdl.com/

地址&#xff1a;https://crxdl.com/ postman插件&#xff1a;talend json插件库&#xff1a;csdn插件 抓取视频&#xff1a;猫抓

科技富豪抑郁了

原美团二当家王慧文据说抑郁了 什么能解决抑郁问题&#xff1f; 趣讲大白话&#xff1a;科技富豪也抑郁 【趣讲信息科技216期】 **************************** 王富豪创立光年之外AI公司2个月就休息了 知识解决不了抑郁问题 抑郁是现代社会一个常见的症状 是压力所带来的综合症…