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

例子:

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QItemSelectionModel>
#include <QMainWindow>
#include <QStandardItemModel> QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = nullptr);
~MainWindow(); private slots:
void on_actOpen_triggered(); void on_actSave_triggered(); void on_actOpenBin_triggered(); void on_actSaveBin_triggered(); void on_actTabReset_triggered(); private:
Ui::MainWindow *ui; QStandardItemModel *model;
QItemSelectionModel *selectModel; void defaultTable(int rowNumber);
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QFileDialog>
#include <QDebug> MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this); model = new QStandardItemModel(this);
model->setRowCount(10);
QStringList headerList;
headerList << "测深(m)" << "垂深(m)" << "方位(°)" << "总位移(m)" << "固井质量" << "测井取样";
model->setHorizontalHeaderLabels(headerList); //设置表头文字
selectModel = new QItemSelectionModel(model);
ui->tableView->setModel(model);
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_actOpen_triggered()//打开stm,二进制读写,怎么写就怎么读,不然会导致乱码
{
QString path = QCoreApplication::applicationDirPath();
QString fileName = QFileDialog::getOpenFileName(this, "", path, "Qt 预定义编码(*.stm)");
if (!fileName.isEmpty()) {//
QFile file(fileName);
if (file.open(QIODevice::ReadOnly)) {
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_5_12);//指定Qt读写版本号
qint16 rowCount, colCount;
stream >> rowCount;
stream >> colCount;
defaultTable(rowCount);
QString str;
for (int i = 0; i < colCount; i++) {
stream >> str;
}
//数据区域
qint16 depth;
qreal meaDepth, direction, offSet;
QString quality;
bool sample;
QModelIndex index = model->index(0, 0);
QStandardItem *item = model->itemFromIndex(index);
for (int i = 0; i < rowCount; i++) {
stream >> depth;
index = model->index(i, 0);
item = model->itemFromIndex(index);
item->setData(depth, Qt::DisplayRole); stream >> meaDepth;
index = model->index(i, 1);
item = model->itemFromIndex(index);
item->setData(meaDepth, Qt::DisplayRole); stream >> direction;
index = model->index(i, 2);
item = model->itemFromIndex(index);
item->setData(depth, Qt::DisplayRole); stream >> offSet;
index = model->index(i, 3);
item = model->itemFromIndex(index);
item->setData(offSet, Qt::DisplayRole); stream >> quality;
index = model->index(i, 4);
item = model->itemFromIndex(index);
item->setData(quality, Qt::DisplayRole); stream >> sample;
index = model->index(i, 5);
item = model->itemFromIndex(index);
item->setCheckState(sample ? Qt::Checked : Qt::Unchecked);
}
file.close();
}
}
} void MainWindow::on_actSave_triggered()//保存stm,二进制写入
{
QString path = QCoreApplication::applicationDirPath();
QString fileName = QFileDialog::getSaveFileName(this, "", path, "Qt 预定义编码(*.stm)");//保存stm文件
if (!fileName.isEmpty()) {
QFile file(fileName);
if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_5_12);//指定Qt读写版本号,不写会有默认值
qint16 row = model->rowCount();
stream << row;
qint16 col = model->columnCount();
stream << col;
for (int i = 0; i < model->columnCount(); i++) {
stream << model->horizontalHeaderItem(i)->text();
} for (int i = 0; i < model->rowCount(); i++) {
qint16 dep = model->item(i, 0)->data(Qt::DisplayRole).toInt();
stream << dep;
qreal meaDep = model->item(i, 1)->data(Qt::DisplayRole).toFloat();
stream << meaDep;
qreal direc = model->item(i, 2)->data(Qt::DisplayRole).toFloat();
stream << direc;
qreal offset = model->item(i, 3)->data(Qt::DisplayRole).toFloat();
stream << offset;
QString quality = model->item(i, 4)->data(Qt::DisplayRole).toString();
stream << quality;
bool sample = model->item(i, 5)->checkState() == Qt::Checked;
stream << sample;
} file.close();
}
}
} void MainWindow::on_actOpenBin_triggered() //打开data,不是Qt预定义的类型了
{
QString path = QCoreApplication::applicationDirPath();
QString fileName = QFileDialog::getOpenFileName(this, "", path, "标准编码(*.dat)");
if (!fileName.isEmpty()) {//
QFile file(fileName);
if (file.open(QIODevice::ReadOnly)) {
QDataStream stream(&file);
stream.setByteOrder(QDataStream::LittleEndian);
qint16 rowCount, colCount;
stream.readRawData((char *)&rowCount, sizeof(qint16));
stream.readRawData((char *)&colCount, sizeof(qint16));
defaultTable(rowCount);
//表头
char *buffer;
uint length;
for (int i = 0; i < colCount; i++) {
stream.readBytes(buffer, length);
QString str = QString::fromLocal8Bit(buffer, length);
} //数据区域
qint16 depth;
qreal meaDepth, direction, offSet;
QString quality;
qint8 sample;//布尔大小
QModelIndex index = model->index(0, 0);
QStandardItem *item = model->itemFromIndex(index);
for (int i = 0; i < rowCount; i++) {
stream.readRawData((char *)&depth, sizeof(qint16));
index = model->index(i, 0);
item = model->itemFromIndex(index);
item->setData(depth, Qt::DisplayRole); stream.readRawData((char *)&meaDepth, sizeof(qreal));
index = model->index(i, 1);
item = model->itemFromIndex(index);
item->setData(meaDepth, Qt::DisplayRole); stream.readRawData((char *)&direction, sizeof(qreal));
index = model->index(i, 2);
item = model->itemFromIndex(index);
item->setData(direction, Qt::DisplayRole); stream.readRawData((char *)&offSet, sizeof(qreal));
index = model->index(i, 3);
item = model->itemFromIndex(index);
item->setData(offSet, Qt::DisplayRole); stream.readBytes(buffer, length);
quality = QString::fromLocal8Bit(buffer, length);
index = model->index(i, 4);
item = model->itemFromIndex(index);
item->setData(quality, Qt::DisplayRole); stream.readRawData((char *)&sample, sizeof(qint8));
index = model->index(i, 5);
item = model->itemFromIndex(index);
item->setCheckState(sample ? Qt::Checked : Qt::Unchecked);
}
file.close();
}
}
} void MainWindow::on_actSaveBin_triggered() //保存data
{
QString path = QCoreApplication::applicationDirPath();
QString fileName = QFileDialog::getSaveFileName(this, "", path, "Qt 预定义编码(*.dat)");//保存stm文件
if (!fileName.isEmpty()) {
QFile file(fileName);
if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
QDataStream stream(&file);
stream.setByteOrder(QDataStream::LittleEndian);
qint16 row = model->rowCount();
qint16 col = model->columnCount();
stream.writeRawData((char *)&row, sizeof(qint16));
stream.writeRawData((char *)&col, sizeof(qint16));
for (int i = 0; i < model->columnCount(); i++) {
QString str = model->horizontalHeaderItem(i)->text();
QByteArray arr = str.toUtf8();
stream.writeBytes(arr, arr.length());
} for (int i = 0; i < model->rowCount(); i++) {
qint16 dep = model->item(i, 0)->data(Qt::DisplayRole).toInt();
stream.writeRawData((char *)&dep, sizeof(qint16));
qreal meaDep = model->item(i, 1)->data(Qt::DisplayRole).toFloat();
stream.writeRawData((char *)&meaDep, sizeof(qreal));
qreal direc = model->item(i, 2)->data(Qt::DisplayRole).toFloat();
stream.writeRawData((char *)&direc, sizeof(qreal));
qreal offset = model->item(i, 3)->data(Qt::DisplayRole).toFloat();
stream.writeRawData((char *)&offset, sizeof(qreal));
QString quality = model->item(i, 4)->data(Qt::DisplayRole).toString();
stream.writeBytes(quality.toUtf8(), sizeof(quality.toUtf8().length()));
qint8 sample = model->item(i, 5)->checkState() == Qt::Checked ? 1 : 0;
stream.writeRawData((char *)&sample, sizeof(qint8));
} file.close();
}
}
} void MainWindow::on_actTabReset_triggered() //表格复位
{
defaultTable(8);
} void MainWindow::defaultTable(int rowNumber) //默认表格样式
{
model->removeRows(0, model->rowCount());
model->setRowCount(rowNumber);
for (int i = 0; i < rowNumber; i++) {
QModelIndex index = model->index(i, model->columnCount() - 1);
QStandardItem *item = model->itemFromIndex(index);
item->setCheckable(true);
item->setEditable(false);
item->setText(model->headerData(model->columnCount() - 1, Qt::Horizontal).toString());
}
}

界面

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. mysql忘记密码的终极解决方案(docker-compose)

    MYSQL8的安全性能有所提高,装好后,各种不适应,需要各种调试. 1. 首先,root密码忘记或是更改,操作步骤: vi mysql/config/my.cnf 在[mysqld]的段中加上一句:s ...

  2. P6474 [NOI Online #2 入门组] 荆轲刺秦王 题解

    荆轲将会臭名昭著 首先 $15$ 做法很简单,那就是直接 `cout<<-1` 考虑用 BFS 来解思路很简单,但是怎么求每个士兵的控制范围呢? 直接暴力时间复杂度是 $O(nma^2)$ ...

  3. WinDbg: Failed to find runtime module (coreclr.dll or clr.dll or libcoreclr.so)

    当我们通过 WinDbg 启动一个 .NET 的程序时,WinDbg 将会在运行可执行之前执行一个中断,此时还没有加载 .NET 的运行时. 但是,SOS 扩展需要 clr.dll 或者 corecl ...

  4. AlainConfig

    核心配置对象. 一个配置对象 AlainConfig, 它有一个默认的 一个配置服务:AlainConfigService https://github.com/ng-alain/delon/blob ...

  5. H2数据UNIX_TIMESTAMP兼容问题

    开篇  今天某同事在spring结合H2实现mybatis DAO层单测的时候遇到一个问题,本着人道主义临时支持下我司大xx业务,就帮忙一起看了下,回想一下整个过程还是挺有意思的,就顺便写了这篇文章来 ...

  6. Qt开发经验小技巧231-235

    关于c++中继承多态virtual和override的几点总结. 子类可以直接使用基类中的protected下的变量和函数. 基类函数没加virtual,子类有相同函数,实现的是覆盖.用基类指针调用时 ...

  7. 综述😋Security and Privacy Challenges of ✌Large Language Models A Survey

  8. .NET Core + Kafka 开发指南

    什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目.Kafka主要用于构建实时数据管道和流式应用程序. Kafka ...

  9. 今天记录一下管理系统中预览pdf的方法

    在管理系统中,有很多需要预览文件的操作,既方便用户查看又可以不用打开新的页面,我发现一个不错的方法,记录一下 <el-dialog title="" :visible.syn ...

  10. AI 与 Mermaid 使用教程之流程图 - 从入门到精通

    本文由 Mermaid中文文档 整理而来,并且它同时提供了一个 Mermaid在线编辑器,支持在线编辑与生成流程图. 在文章的末尾我们将介绍如何使用AI来自动生成 Mermaid 流程图. Merma ...