QT5笔记: 30. 二进制文件读写
- Qt 预定义类型文件 *.stm
- 标准二进制文件 *.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. 二进制文件读写的更多相关文章
- [转载:]Fortran 二进制文件读写
一些朋友总是咨询关于二进制文件的读写和转化.这里就我自己的理解说一说. 一).一般问题 二进制文件与我们通常使用的文本文件储存方式有根本的不同.这样的不同很难用言语表达,自己亲自看一看,理解起来会容易 ...
- Qt 学习之路 2(36):二进制文件读写
Qt 学习之路 2(36):二进制文件读写 豆子 2013年1月6日 Qt 学习之路 2 20条评论 在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice ...
- JAVA核心技术I---JAVA基础知识(二进制文件读写和zip文件读写)
一:二进制文件读写 (一)写文件 –先创建文件,写入数据,关闭文件 –FileOutputStream, BufferedOutputStream,DataOutputStream –DataOutp ...
- C++二进制文件读写
简单二进制文件读写,多文件 /*Demo9.1.cpp*/ #include <iostream> #include <fstream> #include <string ...
- Qt 学习之路:二进制文件读写
在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice提供了read().readLine()等基本的操作.同时,Qt 还提供了更高一级的操作:用于二进制的 ...
- Qt 学习 之 二进制文件读写
在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice提供了read().readLine()等基本的操作.同时,Qt 还提供了更高一级的操作:用于二进制的 ...
- 转载-Python学习笔记之文件读写
Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...
- Qt 二进制文件读写(使用“魔术数字”)
今天开始进入 Qt 的另一个部分:文件读写,也就是 IO.文件读写在很多应用程序中都是需要的.Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力.常用的IO ...
- Qt5对Json的读写
主要任务:通过Qt5完成对Json格式的文件的读写操作. ①首先读取json文件进行解析 ②对读取出来的东西判断是QJsonObject还是QJsonArray类型③对相应的类型根据提供的key ...
- Python学习笔记九-文件读写
1,读取文件: f=open('目录','读写模式',encoding='gbk,error='egiong') 后三项可以不写但是默认是' r'读模式:open函数打开的文件对象会自动加上read( ...
随机推荐
- mysql忘记密码的终极解决方案(docker-compose)
MYSQL8的安全性能有所提高,装好后,各种不适应,需要各种调试. 1. 首先,root密码忘记或是更改,操作步骤: vi mysql/config/my.cnf 在[mysqld]的段中加上一句:s ...
- P6474 [NOI Online #2 入门组] 荆轲刺秦王 题解
荆轲将会臭名昭著 首先 $15$ 做法很简单,那就是直接 `cout<<-1` 考虑用 BFS 来解思路很简单,但是怎么求每个士兵的控制范围呢? 直接暴力时间复杂度是 $O(nma^2)$ ...
- WinDbg: Failed to find runtime module (coreclr.dll or clr.dll or libcoreclr.so)
当我们通过 WinDbg 启动一个 .NET 的程序时,WinDbg 将会在运行可执行之前执行一个中断,此时还没有加载 .NET 的运行时. 但是,SOS 扩展需要 clr.dll 或者 corecl ...
- AlainConfig
核心配置对象. 一个配置对象 AlainConfig, 它有一个默认的 一个配置服务:AlainConfigService https://github.com/ng-alain/delon/blob ...
- H2数据UNIX_TIMESTAMP兼容问题
开篇 今天某同事在spring结合H2实现mybatis DAO层单测的时候遇到一个问题,本着人道主义临时支持下我司大xx业务,就帮忙一起看了下,回想一下整个过程还是挺有意思的,就顺便写了这篇文章来 ...
- Qt开发经验小技巧231-235
关于c++中继承多态virtual和override的几点总结. 子类可以直接使用基类中的protected下的变量和函数. 基类函数没加virtual,子类有相同函数,实现的是覆盖.用基类指针调用时 ...
- 综述😋Security and Privacy Challenges of ✌Large Language Models A Survey
- .NET Core + Kafka 开发指南
什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目.Kafka主要用于构建实时数据管道和流式应用程序. Kafka ...
- 今天记录一下管理系统中预览pdf的方法
在管理系统中,有很多需要预览文件的操作,既方便用户查看又可以不用打开新的页面,我发现一个不错的方法,记录一下 <el-dialog title="" :visible.syn ...
- AI 与 Mermaid 使用教程之流程图 - 从入门到精通
本文由 Mermaid中文文档 整理而来,并且它同时提供了一个 Mermaid在线编辑器,支持在线编辑与生成流程图. 在文章的末尾我们将介绍如何使用AI来自动生成 Mermaid 流程图. Merma ...