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( ...
随机推荐
- rocketMQ集群部署
RocketMQ集群部署 RocketMQ是一款非常优秀的消息中间件,运用的场景也是非常丰富,且在各大公司运用中也非常广泛.但是它是如何进行部署的呢,以及它的高可用是如何实现的呢.那么就由我来为大家讲 ...
- uni-app在微信小程序端自定义组件中样式穿透失效
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app. 坑位 最近因UI有别 ...
- 服务迁移之《tomcat性能优化》
删除无用的connector,因为一般的tomcat前面都会挂有nginx服务 增加connnector使用的线程池的数量 删除没有用的listener host优化项:autoDeploy设置为fa ...
- .NET 服务发现
.NET 服务发现 https://learn.microsoft.com/en-us/dotnet/core/extensions/service-discovery?tabs=dotnet-cli ...
- 使用 OpenXML 创建第一个 Word 文档
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; public class Op ...
- 若依多模块版本,Linux下用Tomcat部署
若依多模块版本 简介 下载地址 https://gitee.com/y_project/RuoYi 下载项目,打war包 下载项目 到 Gitee 下载项目 用 idea 打开,会自动下载 pom 依 ...
- shell内置字符串替换
shell变量赋值语法: 使用规则 解释单引号 所见即所得,即输出时会将单引号内的所有內容都原样输出,或者描述为单引号里面看到的是什么就会输出什么,这称为强引用双引号 (默认) 输出双引号内的所有内容 ...
- sublime text 4 安装(含激活码)
一.下载步骤 官网地址:Sublime Text - the sophisticated text editor for code, markup and prose windows下载链接:Than ...
- JVM故障分析及性能优化系列之四:jstack生成的Thread Dump日志线程状态
https://www.javatang.com/archives/2017/10/25/36441958.html JVM故障分析及性能优化系列文章 JVM故障分析及性能优化系列之一:使用jstac ...
- Qt音视频开发17-vlc内核回调拿图片进行绘制
一.前言 在众多播放器中,支持的种类格式众多,并支持DVD影音光盘,VCD影音光盘及各类流式协议,提供了sdk进行开发,这点是至关重要的,尽管很多优秀的播放器很牛逼,由于没有提供sdk第三方开发,少了 ...