QT5笔记: 30. 二进制文件读写

  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());
    }
}

界面
image

posted @ 2023-03-16 13:37  echo_lovely  阅读(395)  评论(0编辑  收藏  举报