1. Qt 预定义类型文件 *.stm
  2. 标准二进制文件 *.dat

例子:

MainWindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QItemSelectionModel>
  4. #include <QMainWindow>
  5. #include <QStandardItemModel>
  6. QT_BEGIN_NAMESPACE
  7. namespace Ui { class MainWindow; }
  8. QT_END_NAMESPACE
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. MainWindow(QWidget *parent = nullptr);
  14. ~MainWindow();
  15. private slots:
  16. void on_actOpen_triggered();
  17. void on_actSave_triggered();
  18. void on_actOpenBin_triggered();
  19. void on_actSaveBin_triggered();
  20. void on_actTabReset_triggered();
  21. private:
  22. Ui::MainWindow *ui;
  23. QStandardItemModel *model;
  24. QItemSelectionModel *selectModel;
  25. void defaultTable(int rowNumber);
  26. };
  27. #endif // MAINWINDOW_H

MainWindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QFileDialog>
  4. #include <QDebug>
  5. MainWindow::MainWindow(QWidget *parent)
  6. : QMainWindow(parent)
  7. , ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. model = new QStandardItemModel(this);
  11. model->setRowCount(10);
  12. QStringList headerList;
  13. headerList << "测深(m)" << "垂深(m)" << "方位(°)" << "总位移(m)" << "固井质量" << "测井取样";
  14. model->setHorizontalHeaderLabels(headerList); //设置表头文字
  15. selectModel = new QItemSelectionModel(model);
  16. ui->tableView->setModel(model);
  17. }
  18. MainWindow::~MainWindow()
  19. {
  20. delete ui;
  21. }
  22. void MainWindow::on_actOpen_triggered()//打开stm,二进制读写,怎么写就怎么读,不然会导致乱码
  23. {
  24. QString path = QCoreApplication::applicationDirPath();
  25. QString fileName = QFileDialog::getOpenFileName(this, "", path, "Qt 预定义编码(*.stm)");
  26. if (!fileName.isEmpty()) {//
  27. QFile file(fileName);
  28. if (file.open(QIODevice::ReadOnly)) {
  29. QDataStream stream(&file);
  30. stream.setVersion(QDataStream::Qt_5_12);//指定Qt读写版本号
  31. qint16 rowCount, colCount;
  32. stream >> rowCount;
  33. stream >> colCount;
  34. defaultTable(rowCount);
  35. QString str;
  36. for (int i = 0; i < colCount; i++) {
  37. stream >> str;
  38. }
  39. //数据区域
  40. qint16 depth;
  41. qreal meaDepth, direction, offSet;
  42. QString quality;
  43. bool sample;
  44. QModelIndex index = model->index(0, 0);
  45. QStandardItem *item = model->itemFromIndex(index);
  46. for (int i = 0; i < rowCount; i++) {
  47. stream >> depth;
  48. index = model->index(i, 0);
  49. item = model->itemFromIndex(index);
  50. item->setData(depth, Qt::DisplayRole);
  51. stream >> meaDepth;
  52. index = model->index(i, 1);
  53. item = model->itemFromIndex(index);
  54. item->setData(meaDepth, Qt::DisplayRole);
  55. stream >> direction;
  56. index = model->index(i, 2);
  57. item = model->itemFromIndex(index);
  58. item->setData(depth, Qt::DisplayRole);
  59. stream >> offSet;
  60. index = model->index(i, 3);
  61. item = model->itemFromIndex(index);
  62. item->setData(offSet, Qt::DisplayRole);
  63. stream >> quality;
  64. index = model->index(i, 4);
  65. item = model->itemFromIndex(index);
  66. item->setData(quality, Qt::DisplayRole);
  67. stream >> sample;
  68. index = model->index(i, 5);
  69. item = model->itemFromIndex(index);
  70. item->setCheckState(sample ? Qt::Checked : Qt::Unchecked);
  71. }
  72. file.close();
  73. }
  74. }
  75. }
  76. void MainWindow::on_actSave_triggered()//保存stm,二进制写入
  77. {
  78. QString path = QCoreApplication::applicationDirPath();
  79. QString fileName = QFileDialog::getSaveFileName(this, "", path, "Qt 预定义编码(*.stm)");//保存stm文件
  80. if (!fileName.isEmpty()) {
  81. QFile file(fileName);
  82. if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
  83. QDataStream stream(&file);
  84. stream.setVersion(QDataStream::Qt_5_12);//指定Qt读写版本号,不写会有默认值
  85. qint16 row = model->rowCount();
  86. stream << row;
  87. qint16 col = model->columnCount();
  88. stream << col;
  89. for (int i = 0; i < model->columnCount(); i++) {
  90. stream << model->horizontalHeaderItem(i)->text();
  91. }
  92. for (int i = 0; i < model->rowCount(); i++) {
  93. qint16 dep = model->item(i, 0)->data(Qt::DisplayRole).toInt();
  94. stream << dep;
  95. qreal meaDep = model->item(i, 1)->data(Qt::DisplayRole).toFloat();
  96. stream << meaDep;
  97. qreal direc = model->item(i, 2)->data(Qt::DisplayRole).toFloat();
  98. stream << direc;
  99. qreal offset = model->item(i, 3)->data(Qt::DisplayRole).toFloat();
  100. stream << offset;
  101. QString quality = model->item(i, 4)->data(Qt::DisplayRole).toString();
  102. stream << quality;
  103. bool sample = model->item(i, 5)->checkState() == Qt::Checked;
  104. stream << sample;
  105. }
  106. file.close();
  107. }
  108. }
  109. }
  110. void MainWindow::on_actOpenBin_triggered() //打开data,不是Qt预定义的类型了
  111. {
  112. QString path = QCoreApplication::applicationDirPath();
  113. QString fileName = QFileDialog::getOpenFileName(this, "", path, "标准编码(*.dat)");
  114. if (!fileName.isEmpty()) {//
  115. QFile file(fileName);
  116. if (file.open(QIODevice::ReadOnly)) {
  117. QDataStream stream(&file);
  118. stream.setByteOrder(QDataStream::LittleEndian);
  119. qint16 rowCount, colCount;
  120. stream.readRawData((char *)&rowCount, sizeof(qint16));
  121. stream.readRawData((char *)&colCount, sizeof(qint16));
  122. defaultTable(rowCount);
  123. //表头
  124. char *buffer;
  125. uint length;
  126. for (int i = 0; i < colCount; i++) {
  127. stream.readBytes(buffer, length);
  128. QString str = QString::fromLocal8Bit(buffer, length);
  129. }
  130. //数据区域
  131. qint16 depth;
  132. qreal meaDepth, direction, offSet;
  133. QString quality;
  134. qint8 sample;//布尔大小
  135. QModelIndex index = model->index(0, 0);
  136. QStandardItem *item = model->itemFromIndex(index);
  137. for (int i = 0; i < rowCount; i++) {
  138. stream.readRawData((char *)&depth, sizeof(qint16));
  139. index = model->index(i, 0);
  140. item = model->itemFromIndex(index);
  141. item->setData(depth, Qt::DisplayRole);
  142. stream.readRawData((char *)&meaDepth, sizeof(qreal));
  143. index = model->index(i, 1);
  144. item = model->itemFromIndex(index);
  145. item->setData(meaDepth, Qt::DisplayRole);
  146. stream.readRawData((char *)&direction, sizeof(qreal));
  147. index = model->index(i, 2);
  148. item = model->itemFromIndex(index);
  149. item->setData(direction, Qt::DisplayRole);
  150. stream.readRawData((char *)&offSet, sizeof(qreal));
  151. index = model->index(i, 3);
  152. item = model->itemFromIndex(index);
  153. item->setData(offSet, Qt::DisplayRole);
  154. stream.readBytes(buffer, length);
  155. quality = QString::fromLocal8Bit(buffer, length);
  156. index = model->index(i, 4);
  157. item = model->itemFromIndex(index);
  158. item->setData(quality, Qt::DisplayRole);
  159. stream.readRawData((char *)&sample, sizeof(qint8));
  160. index = model->index(i, 5);
  161. item = model->itemFromIndex(index);
  162. item->setCheckState(sample ? Qt::Checked : Qt::Unchecked);
  163. }
  164. file.close();
  165. }
  166. }
  167. }
  168. void MainWindow::on_actSaveBin_triggered() //保存data
  169. {
  170. QString path = QCoreApplication::applicationDirPath();
  171. QString fileName = QFileDialog::getSaveFileName(this, "", path, "Qt 预定义编码(*.dat)");//保存stm文件
  172. if (!fileName.isEmpty()) {
  173. QFile file(fileName);
  174. if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
  175. QDataStream stream(&file);
  176. stream.setByteOrder(QDataStream::LittleEndian);
  177. qint16 row = model->rowCount();
  178. qint16 col = model->columnCount();
  179. stream.writeRawData((char *)&row, sizeof(qint16));
  180. stream.writeRawData((char *)&col, sizeof(qint16));
  181. for (int i = 0; i < model->columnCount(); i++) {
  182. QString str = model->horizontalHeaderItem(i)->text();
  183. QByteArray arr = str.toUtf8();
  184. stream.writeBytes(arr, arr.length());
  185. }
  186. for (int i = 0; i < model->rowCount(); i++) {
  187. qint16 dep = model->item(i, 0)->data(Qt::DisplayRole).toInt();
  188. stream.writeRawData((char *)&dep, sizeof(qint16));
  189. qreal meaDep = model->item(i, 1)->data(Qt::DisplayRole).toFloat();
  190. stream.writeRawData((char *)&meaDep, sizeof(qreal));
  191. qreal direc = model->item(i, 2)->data(Qt::DisplayRole).toFloat();
  192. stream.writeRawData((char *)&direc, sizeof(qreal));
  193. qreal offset = model->item(i, 3)->data(Qt::DisplayRole).toFloat();
  194. stream.writeRawData((char *)&offset, sizeof(qreal));
  195. QString quality = model->item(i, 4)->data(Qt::DisplayRole).toString();
  196. stream.writeBytes(quality.toUtf8(), sizeof(quality.toUtf8().length()));
  197. qint8 sample = model->item(i, 5)->checkState() == Qt::Checked ? 1 : 0;
  198. stream.writeRawData((char *)&sample, sizeof(qint8));
  199. }
  200. file.close();
  201. }
  202. }
  203. }
  204. void MainWindow::on_actTabReset_triggered() //表格复位
  205. {
  206. defaultTable(8);
  207. }
  208. void MainWindow::defaultTable(int rowNumber) //默认表格样式
  209. {
  210. model->removeRows(0, model->rowCount());
  211. model->setRowCount(rowNumber);
  212. for (int i = 0; i < rowNumber; i++) {
  213. QModelIndex index = model->index(i, model->columnCount() - 1);
  214. QStandardItem *item = model->itemFromIndex(index);
  215. item->setCheckable(true);
  216. item->setEditable(false);
  217. item->setText(model->headerData(model->columnCount() - 1, Qt::Horizontal).toString());
  218. }
  219. }

界面

QT5笔记: 30. 二进制文件读写的更多相关文章

  1. [转载:]Fortran 二进制文件读写

    一些朋友总是咨询关于二进制文件的读写和转化.这里就我自己的理解说一说. 一).一般问题 二进制文件与我们通常使用的文本文件储存方式有根本的不同.这样的不同很难用言语表达,自己亲自看一看,理解起来会容易 ...

  2. Qt 学习之路 2(36):二进制文件读写

    Qt 学习之路 2(36):二进制文件读写 豆子 2013年1月6日 Qt 学习之路 2 20条评论 在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice ...

  3. JAVA核心技术I---JAVA基础知识(二进制文件读写和zip文件读写)

    一:二进制文件读写 (一)写文件 –先创建文件,写入数据,关闭文件 –FileOutputStream, BufferedOutputStream,DataOutputStream –DataOutp ...

  4. C++二进制文件读写

    简单二进制文件读写,多文件 /*Demo9.1.cpp*/ #include <iostream> #include <fstream> #include <string ...

  5. Qt 学习之路:二进制文件读写

    在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice提供了read().readLine()等基本的操作.同时,Qt 还提供了更高一级的操作:用于二进制的 ...

  6. Qt 学习 之 二进制文件读写

    在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice提供了read().readLine()等基本的操作.同时,Qt 还提供了更高一级的操作:用于二进制的 ...

  7. 转载-Python学习笔记之文件读写

    Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...

  8. Qt 二进制文件读写(使用“魔术数字”)

    今天开始进入 Qt 的另一个部分:文件读写,也就是 IO.文件读写在很多应用程序中都是需要的.Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力.常用的IO ...

  9. Qt5对Json的读写

      主要任务:通过Qt5完成对Json格式的文件的读写操作. ①首先读取json文件进行解析  ②对读取出来的东西判断是QJsonObject还是QJsonArray类型③对相应的类型根据提供的key ...

  10. Python学习笔记九-文件读写

    1,读取文件: f=open('目录','读写模式',encoding='gbk,error='egiong') 后三项可以不写但是默认是' r'读模式:open函数打开的文件对象会自动加上read( ...

随机推荐

  1. InstallShield软件详解

    InstallShield使用说明 文章目录 InstallShield使用说明 术语解释 工程介绍 InstallScript Basic MSI InstallScript MSI 如何选择适合的 ...

  2. uniapp权限判断

    写法如下 // 检查是否有写入外部存储的权限 function writeExternalStoragePermission() { return new Promise((resolve, reje ...

  3. (二)Springboot + vue + 达梦数据库构建RBAC权限模型前后端分离脚手架保姆级教程(后端项目)

    XX后台管理系统 Springboot + vue + dm8 的前后端分离项目,后端项目 https://spring.io https://start.aliyun.com 1. 创建项目 初始化 ...

  4. CSS 面试题

    CSS3有哪些新能特性? 新增特性: 圆角border-radius 阴影 box-shadow 文字特效 text-shadow 线性渐变 gradient 变形 transform 增加了css选 ...

  5. T 语言语法设计(预审稿)

    欢迎吐槽 一. 字面量 1. 数字字面量 0, 0xff, 0b10_01, .1 2. 字符串字面量 'x', "x\n\uffff\Uffffffff", `x{1}y` 3. ...

  6. [MySQL]数据库修复(Example:1146 Error )

    删除数据库自带的表,导致的异常问题修复方法如下 运行cmd,查询MYSQL所在位置 where mysql cd到MySQL安装目录的bin目录下 执行命令 mysql_upgrade -u root ...

  7. 【Java】【SpringBoot】CP03:热部署

    This article is written by Xrilang(Chinese Name:萌狼蓝天) If you want find me ,You can contact me in Bil ...

  8. kubectl get deploy

    for i in `kubectl get deployments.apps -n nvpc-apps-02|grep -v NAME|awk '{print $1}'`; do kubectl ge ...

  9. 永久告别mac屏幕涂层脱落

    转载:https://www.feng.com/post/11380203 我从2011年开始使用Mac book pro电脑,到现在的2016款已经是第三台了,我从来都不会被涂层脱落这个问题困扰,我 ...

  10. Qt/C++地图测距/显示不同线段的距离/拿到测距结果/测距结束信号

    一.前言说明 地图测距在地图组件中属于一个比较小众的功能,但是又不得不提供,有时候用户希望直接在地图上选点,测算距离,尤其是在一些军事领域用的比较多,测距功能提炼出来的共性就是,每一段都有距离,最后鼠 ...