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( ...
随机推荐
- [NET,C# ] Nuget包发布流程
1.新建一个.NET Core类库 2.新增一个方法,并编译项目 3.下载Nuget.exe,与刚才新建的类库放在同一目录下 下载地址:https://www.nuget.org/downloads ...
- 断言、drf之请求与响应
目录 一.断言 二.drf之请求 2.1 Request能够解析的前端传入的编码格式 2.2 Request类有哪些属性和方法(学过) 常用参数 Response类的实例化参数 三.drf之响应 3. ...
- Springboot上传文件大小限制处理
今天在开发过程中遇到一个文件上传的问题 io.undertow.server.RequestTooBigException: UT000020: Connection terminated as re ...
- 离线yum安装k8s(直接yum安装k8s)快速部署
问题:如何在没有离线环境上服务器yum安装k8s环境? 环境:准备一台互联网的服务器+离线的服务器 写的比较简便........ 1.互联网服务操作添加阿里云YUM的软件源 cat > /etc ...
- Qt编写可视化大屏电子看板系统32-模块10大屏地图
一.前言 大屏地图模块采用浏览器模块+echart组件,Qt自带了webkit或者webengine模块,其中在win上mingw编译器的Qt5.6以后的版本,没有了浏览器模块,这个就需要用第三方的浏 ...
- Qt编写安防视频监控系统64-子模块8飞行轨迹
一.前言 飞行轨迹子模块是专为无人机打造的模块,也可以作为机器人移动模块,通过传入一个经纬度值,实时更新设备的位置和绘制轨迹,模块已经内置了接口进行处理,支持不同设备不同的轨迹颜色(这个功能好). 这 ...
- Qt开源作品26-通用按钮地图效果
一.前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜 ...
- Qt编写安防视频监控系统28-摄像机点位
一.前言 摄像机点位的功能主要是在图片地图和在线离线地图上设置对应摄像机的位置,然后双击可以实时预览对应摄像机的视频,在图片地图上拖动摄像机图标到对应位置,系统会自动保存位置信息,在网页地图上的摄像机 ...
- SHAPEIT算法简介
本文是基于SHAPIT2和SHAPEIT4的,先介绍SHAPEIT2的算法原理,然后简单介绍了一下SHAPEIT4更新的部分.文中介绍主要集中在算法部分,比较简介,具体内容请看参考文献. [SHAPE ...
- 【Java RPC】使用netty手写一个RPC框架 结合新特性 虚拟线程
[手写RPC框架]如何使用netty手写一个RPC框架 结合新特性 虚拟线程 什么是RPC框架 RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服 ...