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( ...
随机推荐
- Mysql8忽略大小写的解决方案
一.删除服务器数据文件 由于8.0没法设置参数后重启(失败),所以必须删掉老库,重新启动才行. 切记::本步骤要删掉老库所有资料,如果是数据库当前有用,请做好备份,再进行操作. systemctl ...
- 人工智能应用的“繁花时代”,各大企业何以破局AI模型挑战
AI技术的崛起,为各行业发展带来巨大变革和超强的创新潜力.然而,各大企业在拥抱AI的进程中并非一路坦途,"繁花盛开"的背后隐藏着AI模型生产与管理环节的诸多痛点. 先来看看部分 ...
- bytecode 生成器
基础 objectweb asm 很难用,找了几个高级点的. activej codegen 这个库很像 .net DLR 风格,采用 Expression 抽象,例如 Expressions.add ...
- JVM简介—1.Java内存区域
大纲 1.运行时数据区的介绍 2.运行时数据区各区域的作用 3.各个版本内存区域的变化 4.直接内存的使用和作用 5.站在线程的角度看Java内存区域 6.深入分析堆和栈的区别 7.方法的出入栈和栈上 ...
- C#字符串拼接的几种方式及其性能分析对比
前言 在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询.构建日志信息.格式化用户显示内容等.然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异.今天咱们 ...
- 【MySQL】求和查询,目标值int,但空数据时返回null的问题(Java)
问题分析 int selectDeviceMonthRepairCount(String deviceType, String month); <select id="selectDe ...
- 【原创】利用gitlab多项目自动部署到多个网站目录,自动同步更新,不用插件,重写钩子
原创内容,分享请保留链接. 0.首先在服务器安装gitlab,网上一堆过程省略 1.建几个空仓库admin.web.xxxx等(1个仓库也行).确保每个仓库名称和网站名称要有一致性,比如仓库叫admi ...
- Qt数据库应用4-数据打印到纸张
一.前言 数据能够打印到pdf文件,当然可以打印到纸张,而且使用qprinter默认就是打印到纸张的,上一篇文章写得功能是打印到pdf,其实还要单独特殊设置打印到文件,并指定格式为pdf.不指定输出文 ...
- Qt编写安防视频监控系统26-硬件加速
一.前言 硬件加速这个功能在一年多以前就已经具备,当时对两个内核一个是ffmpeg内核.一个是vlc内核都做了对应的接口函数,只是当时为了简单没有在系统设置中做出接口,vlc做硬件加速不用自己写代码实 ...
- Qt开源作品9-扁平化样式flatui
一.前言 对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反 ...