搜索
bottom↓
回复: 0

《I.MX6U嵌入式Qt开发指南》第八章 文本读写

[复制链接]

出0入234汤圆

发表于 2021-7-14 17:50:41 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2021-8-11 12:28 编辑

1)实验平台:正点原子i.MX6ULL Linux阿尔法开发板
2)  章节摘自【正点原子】《I.MX6U嵌入式Qt开发指南》
3)购买链接:https://item.taobao.com/item.htm?&id=603672744434
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)
正点原子Linux技术交流群:1027879335   1.png


2.jpg


3.png


第八章 文本读写

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


8.1 QFile读写文本

QFile类提供了读取和写入文件的接口。在嵌入式里如果需要读写文件,最简单的方法就是用Qfile,在第14.2和14.3小节就是利用了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对一个文本文件的操作流程是以下这样的。
1.png

8.1.1 应用实例
例01_qfile,读写文本(难度:简单)。项目路径为Qt/2/01_qfile。2是代表第二篇的例程父目录。
在头文件“mainwindow.h”具体代码如下。
mainwindow.h编程后的代码
  1.     /******************************************************************
  2.     Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
  3.     * @projectName   01_qfile
  4.     * @brief         mainwindow.h
  5.     * @author        Deng Zhimao
  6.     * @email         <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
  7.     * @net            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
  8.     * @date           2021-03-27
  9.     *******************************************************************/
  10. 1   #ifndef MAINWINDOW_H
  11. 2   #define MAINWINDOW_H
  12. 3
  13. 4   #include <QMainWindow>
  14. 5   #include <QTextEdit>
  15. 6   #include <QFile>
  16. 7   #include <QVBoxLayout>
  17. 8   #include <QHBoxLayout>
  18. 9   #include <QPushButton>
  19. 10
  20. 11  class MainWindow : public QMainWindow
  21. 12  {
  22. 13      Q_OBJECT
  23. 14
  24. 15  public:
  25. 16      MainWindow(QWidget *parent = nullptr);
  26. 17      ~MainWindow();
  27. 18
  28. 19  private:
  29. 20      /* 用于读取文件后显示 */
  30. 21      QTextEdit *textEdit;
  31. 22
  32. 23      /* QFile类型对象 */
  33. 24      QFile file;
  34. 25
  35. 26      /* 水平布局 */
  36. 27      QHBoxLayout *hBoxLayout;
  37. 28
  38. 29      /* 垂直布局 */
  39. 30      QVBoxLayout *vBoxLayout;
  40. 31
  41. 32      /* 水平布局Widget */
  42. 33      QWidget *hWidget;
  43. 34
  44. 35      /* 垂直布局Widget */
  45. 36      QWidget *vWidget;
  46. 37
  47. 38      /* 打开文件按钮 */
  48. 39      QPushButton *openPushButton;
  49. 40
  50. 41      /* 关闭文件按钮 */
  51. 42      QPushButton *closePushButton;
  52. 43
  53. 44  private slots:
  54. 45
  55. 46      /* 打开文本文件 */
  56. 47      bool openFile();
  57. 48
  58. 49      /* 关闭文本文件 */
  59. 50      void closeFile();
  60. 51  };
复制代码

52  #endif // MAINWINDOW_H
在源文件“mainwindow.cpp”具体代码如下。
mainwindow.cpp编程后的代码
  1.    /******************************************************************
  2.     Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
  3.     * @projectName   01_qfile
  4.     * @brief         mainwindow.cpp
  5.     * @author        Deng Zhimao
  6.     * @email         <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
  7.     * @net            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
  8.     * @date           2021-03-27
  9.     *******************************************************************/
  10.     #include "mainwindow.h"
  11.     #include <QFileDialog>
  12.     #include <QDebug>

  13. 1   MainWindow::MainWindow(QWidget *parent)
  14. 2       : QMainWindow(parent)
  15. 3   {
  16. 4       /* 设置窗口的位置与大小 */
  17. 5       this->setGeometry(0, 0, 800, 480);
  18. 6  
  19. 7       /* 布局设置 */
  20. 8       textEdit = new QTextEdit();
  21. 9       vBoxLayout = new QVBoxLayout();
  22. 10      hBoxLayout = new QHBoxLayout();
  23. 11      vWidget = new QWidget();
  24. 12      hWidget = new QWidget();
  25. 13      openPushButton = new QPushButton();
  26. 14      closePushButton = new QPushButton();
  27. 15
  28. 16      /* 设置两个按钮的大小 */
  29. 17      openPushButton->setMinimumHeight(50);
  30. 18      openPushButton->setMaximumWidth(120);
  31. 19      closePushButton->setMinimumHeight(50);
  32. 20      closePushButton->setMaximumWidth(120);
  33. 21
  34. 22      /* 设置两个按钮的文本 */
  35. 23      openPushButton->setText("打开");
  36. 24      closePushButton->setText("关闭");
  37. 25
  38. 26      /* 设置关闭按钮为不可用属性,需要打开文件才设置为可用属性 */
  39. 27      closePushButton->setEnabled(false);
  40. 28
  41. 29      /* 水平布局 */
  42. 30      hBoxLayout->addWidget(openPushButton);
  43. 31      hBoxLayout->addWidget(closePushButton);
  44. 32      hWidget->setLayout(hBoxLayout);
  45. 33
  46. 34      /* 垂直布局 */
  47. 35      vBoxLayout->addWidget(textEdit);
  48. 36      vBoxLayout->addWidget(hWidget);
  49. 37      vWidget->setLayout(vBoxLayout);
  50. 38
  51. 39      /* 居中 */
  52. 40      setCentralWidget(vWidget);
  53. 41
  54. 42      /* 信号槽连接 */
  55. 43      connect(openPushButton, SIGNAL(clicked()),
  56. 44              this, SLOT(openFile()));
  57. 45      connect(closePushButton, SIGNAL(clicked()),
  58. 46              this, SLOT(closeFile()));
  59. 47  }
  60. 48
  61. 49  MainWindow::~MainWindow()
  62. 50  {
  63. 51  }
  64. 52
  65. 53  bool MainWindow::openFile()
  66. 54  {
  67. 55      /* 获取文件的路径 */
  68. 56      QString fileName = QFileDialog::getOpenFileName(this);
  69. 57
  70. 58      /* 指向文件 */
  71. 59      file.setFileName(fileName);
  72. 60
  73. 61      /* 判断文件是否存在 */
  74. 62      if (!file.exists())
  75. 63          return false;
  76. 64
  77. 65      /* 以读写的方式打开 */
  78. 66      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
  79. 67          return false;
  80. 68
  81. 69      /* 读取文本到textEdit */
  82. 70      textEdit->setPlainText(file.readAll());
  83. 71
  84. 72      /* 设置打开按钮不可用,需要关闭再打开 */
  85. 73      openPushButton->setEnabled(false);
  86. 74
  87. 75      /* 设置关闭按钮为可用属性 */
  88. 76      closePushButton->setEnabled(true);
  89. 77
  90. 78      /* 关闭文件 */
  91. 79      file.close();
  92. 80
  93. 81      return true;
  94. 82  }
  95. 83
  96. 84  void MainWindow::closeFile()
  97. 85  {
  98. 86      /* 检测打开按钮是否可用,不可用时,说明已经打开了文件 */
  99. 87      if (!openPushButton->isEnabled()) {
  100. 88          /* 获取textEdit的文本内容 */
  101. 89          QString str = textEdit->toPlainText();
  102. 90
  103. 91          /* 以只读的方式打开 */
  104. 92          if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
  105. 93              return;
  106. 94
  107. 95          /* 转换为字节数组 */
  108. 96          QByteArray strBytes = str.toUtf8();
  109. 97
  110. 98          /* 写入文件 */
  111. 99          file.write(strBytes, strBytes.length());
  112. 100
  113. 101         /* 清空textEdit的显示内容 */
  114. 102         textEdit->clear();
  115. 103
  116. 104         /* 关闭文件 */
  117. 105         file.close();
  118. 106
  119. 107         /* 重新设置打开和关闭按钮的属性 */
  120. 108         openPushButton->setEnabled(true);
  121. 109         closePushButton->setEnabled(false);
  122. 110     }
  123. 111 }
复制代码


8.1.2 程序运行效果

点击打开。
第八章 文本读写6400.png

        调用系统打开文件的窗口。选择项目路径下的“测试.txt”。
第八章 文本读写6433.png

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

8.2 QTextStream读写文本
QTextStream类为读写文本提供了一个方便的接口,常与QFile结合使用。QTextStream可以在QIODevice、QByteArray或QString上操作。使用QTextStream的流操作符,您可以方便地读写单词、行和数字。为了生成文本,QTextStream支持字段填充和对齐的格式化选项,以及数字的格式化。看到Stream这个名词就知道,它与流操作有关,那么我们可以使用C++的操作符“<<”和“>>”(流提取运算符和流插入运算符)进行操作流了。
8.2.1 应用实例
例02_qtextstream,文本流读写文本(难度:简单)。项目路径为Qt/2/02_qtextstream。QTextStream的例子与QFile的一样,只是在QFile的例子里加入了QTextStream。下面只写出不同部分的代码。详细直接打开项目查看。
在源文件“mainwindow.cpp”具体代码如下。不同的地方已经用红色字体标出。
mainwindow.cpp编程后的代码
  1. 53  bool MainWindow::openFile()
  2. 54  {
  3. 55      /* 获取文件的路径 */
  4. 56      QString fileName = QFileDialog::getOpenFileName(this);
  5. 57
  6. 58      /* 指向文件 */
  7. 59      file.setFileName(fileName);
  8. 60
  9. 61      /* 判断文件是否存在 */
  10. 62      if (!file.exists())
  11. 63          return false;
  12. 64
  13. 65      /* 以读写的方式打开 */
  14. 66      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
  15. 67          return false;
  16. 68
  17. 69      /* 使用文本流读取文件 */
  18. 70      QTextStream stream(&file);
  19. 71
  20. 72      /* 读取文本到textEdit */
  21. 73      textEdit->setPlainText(stream.readAll());
  22. 74
  23. 75      /* 设置打开按钮不可用,需要关闭再打开 */
  24. 76      openPushButton->setEnabled(false);
  25. 77
  26. 78      /* 设置关闭按钮为可用属性 */
  27. 79      closePushButton->setEnabled(true);
  28. 80
  29. 81      /* 关闭文件 */
  30. 82      file.close();
  31. 83
  32. 84      return true;
  33. 85  }
  34. 86
  35. 87  void MainWindow::closeFile()
  36. 88  {
  37. 89      /* 检测打开按钮是否可用,不可用时,说明已经打开了文件 */
  38. 90      if (!openPushButton->isEnabled()) {
  39. 91
  40. 92          /* 以只读的方式打开 */
  41. 93          if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
  42. 94              return;
  43. 95
  44. 96          /* 用文本流读取文件 */
  45. 97          QTextStream stream(&file);
  46. 98
  47. 99          /* 获取textEdit的文本内容,转为字符串 */
  48. 100         QString str = textEdit->toPlainText();
  49. 101
  50. 102         /* 使用流提取运算符,写入文本流 */
  51. 103         stream<<str;
  52. 104
  53. 105         /* 清空textEdit的显示内容 */
  54. 106         textEdit->clear();
  55. 107
  56. 108         /* 关闭文件 */
  57. 109         file.close();
  58. 110
  59. 111         /* 重新设置打开和关闭按钮的属性 */
  60. 112         openPushButton->setEnabled(true);
  61. 113         closePushButton->setEnabled(false);
  62. 114     }
  63. 115 }
复制代码

8.2.2 程序运行效果
与上一小节(8.1.2小节)一样。使用QFile与QTextStream感觉例子看上去没区别。主要是QTextStream还支持字段填充和对齐的格式化选项,例子没有体现出来而已,等我们用到一些特性时还是有区别的。

第八章 文本读写1390.png

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 03:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表