Qt 二进制文件的读写
开发工具:VS2013 +QT5.8.0
实例功能概述

1、新建项目“sample7_2binFile”




完成以上步骤后,生成以下文件:

2、界面设计
如何添加资源文件:

鼠标双击“***.qrc”文件 弹出以下界面:

点击 “Add File” 找到要添加的 icons 所在位置,全选,“打开” 即添加上,别忘了点 “保存”

如何在工具栏添加QAction
先在菜单栏添加需要添加的QAction,然后把它拖放到工具栏上


可视化UI设计,完成后的界面如下图所示:

添加 Qt Class “QWComboBoxDelegate”
QWComboBoxDelegate.h 文件
#pragma once
#include <QItemDelegate>
class QWComboBoxDelegate : public QItemDelegate
{
Q_OBJECT
public:
QWComboBoxDelegate(QObject *parent=0);
~QWComboBoxDelegate();
//自定义代理组件必须继承以下4个函数
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
};
QWComboBoxDelegate.cpp 文件
#include "QWComboBoxDelegate.h"
#include <QComboBox>
//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")
QWComboBoxDelegate::QWComboBoxDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
QWComboBoxDelegate::~QWComboBoxDelegate()
{
}
QWidget *QWComboBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option);
Q_UNUSED(index);
QComboBox *editor = new QComboBox(parent);
editor->addItem("优");
editor->addItem("良");
editor->addItem("一般");
editor->addItem("不合格");
return editor;
}
void QWComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str = index.model()->data(index, Qt::EditRole).toString();
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentText(str);
}
void QWComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *comboBox = static_cast<QComboBox*>(editor);
QString str = comboBox->currentText();
model->setData(index, str, Qt::EditRole);
}
void QWComboBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index);
editor->setGeometry(option.rect);
}
添加 Qt Class “QWFloatSpinDelegate”
QWFloatSpinDelegate.h 文件
#pragma once
#include <QStyledItemDelegate>
class QWFloatSpinDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
QWFloatSpinDelegate(QObject *parent=0);
~QWFloatSpinDelegate();
//自定义代理组件必须继承以下4个函数
//创建编辑组件
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
};
QWFloatSpinDelegate.cpp 文件
#include "QWFloatSpinDelegate.h"
#include <QDoubleSpinBox>
//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")
QWFloatSpinDelegate::QWFloatSpinDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWFloatSpinDelegate::~QWFloatSpinDelegate()
{
}
QWidget *QWFloatSpinDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option);
Q_UNUSED(index);
QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
editor->setFrame(false);
editor->setMinimum(0);
editor->setDecimals(2);
editor->setMaximum(10000);
return editor;
}
void QWFloatSpinDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
float value = index.model()->data(index, Qt::EditRole).toFloat();
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
spinBox->setValue(value);
}
void QWFloatSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
spinBox->interpretText();
float value = spinBox->value();
QString str = QString::asprintf("%.2f", value);
model->setData(index, str, Qt::EditRole);
}
void QWFloatSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index);
editor->setGeometry(option.rect);
}
添加 Qt Class “QWIntSpinDelegate”
QWIntSpinDelegate.h 文件
#pragma once
#include <QStyledItemDelegate>
class QWIntSpinDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
QWIntSpinDelegate(QObject *parent=0);
~QWIntSpinDelegate();
//自定义代理组件必须继承以下4个函数
//创建编辑组件
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
//从数据模型获取数据,显示到代理组件中
void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
//将代理组件的数据,保存到数据模型中
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const Q_DECL_OVERRIDE;
//更新代理编辑组件的大小
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
};
QWIntSpinDelegate.cpp 文件
#include "QWIntSpinDelegate.h"
#include <QSpinBox>
//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")
QWIntSpinDelegate::QWIntSpinDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWIntSpinDelegate::~QWIntSpinDelegate()
{
}
//创建代理编辑组件
QWidget *QWIntSpinDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option);
Q_UNUSED(index);
QSpinBox *editor = new QSpinBox(parent); //创建一个QSpinBox
editor->setFrame(false); //设置为无边框
editor->setMinimum(0);
editor->setMaximum(10000);
return editor; //返回此编辑器
}
//从数据模型获取数据,显示到代理组件中
void QWIntSpinDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
//获取数据模型的模型索引指向的单元的数据
int value = index.model()->data(index, Qt::EditRole).toInt();
QSpinBox *spinBox = static_cast<QSpinBox*>(editor); //强制类型转换
spinBox->setValue(value); //设置编辑器的数值
}
//将代理组件的数据,保存到数据模型中
void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor); //强制类型转换
spinBox->interpretText(); //解释数据,如果数据被修改后,就触发信号
int value = spinBox->value(); //获取spinBox的值
model->setData(index, value, Qt::EditRole); //更新到数据模型
}
//设置组件大小
void QWIntSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index);
editor->setGeometry(option.rect);
}
sample7_2binFile.h 文件
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_sample7_2binFile.h"
#include <QLabel>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include "QWintspindelegate.h"
#include "QWfloatspindelegate.h"
#include "QWComboBoxDelegate.h"
#define FixedColumnCount 6 //文件固定6行
class sample7_2binFile : public QMainWindow
{
Q_OBJECT
public:
sample7_2binFile(QWidget *parent = Q_NULLPTR);
private:
Ui::sample7_2binFileClass ui;
private:
//用于状态栏的信息显示
QLabel *LabCellPos; //当前单元格行列号
QLabel *LabCellText;//当前单元格内容
QWIntSpinDelegate intSpinDelegate; //整型数
QWFloatSpinDelegate floatSpinDelegate;//浮点数
QWComboBoxDelegate comboBoxDelegate; //列表选择
QStandardItemModel *theModel; //数据模型
QItemSelectionModel *theSelection;//Item选择模型
void resetTable(int aRowCount); //表格复位,设定行数
bool saveDataAsStream(QString& aFileName);//将数据保存为数据流文件
bool openDataAsStream(QString& aFileName);//读取数据流文件
bool saveBinaryFile(QString& aFileName);//保存为二进制文件
bool openBinaryFile(QString& aFileName);//打开二进制文件
private slots:
void on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
void on_actOpen_triggered();//打开文件
void on_actAppend_triggered();//添加行
void on_actInsert_triggered();//插入行
void on_actDelete_triggered();//删除行
void on_actSave_triggered();//保存文件
void on_actAlignCenter_triggered();//居中对齐
void on_actFontBold_triggered(bool checked);//字体粗体设置
void on_actAlignLeft_triggered();//左对齐
void on_actAlignRight_triggered();//右对齐
void on_actTabReset_triggered();//表格复位
void on_actSaveBin_triggered();//保存为自编码二进制文件
void on_actOpenBin_triggered();//打开自编码二进制文件
void on_actExit_triggered();//退出
};
sample7_2binFile.cpp 文件
#include "sample7_2binFile.h"
#include <QFileDialog>
#include <QDataStream>
#include <QMessageBox>
//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")
sample7_2binFile::sample7_2binFile(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
theModel = new QStandardItemModel(5, FixedColumnCount, this); //创建数据模型
QStringList headerList;
headerList << "Depth" << "Measured Depth" << "Direction" << "Offset" << "Quality" << "Sampled";
theModel->setHorizontalHeaderLabels(headerList); //设置表头文字
theSelection = new QItemSelectionModel(theModel);//Item选择模型
connect(theSelection, SIGNAL(currentChanged(QModelIndex, QModelIndex)),
this, SLOT(on_currentChanged(QModelIndex, QModelIndex)));
//为tableView设置数据模型
ui.tableView->setModel(theModel); //设置数据模型
ui.tableView->setSelectionModel(theSelection);//设置选择模型
//为各列设置自定义代理组件
ui.tableView->setItemDelegateForColumn(0, &intSpinDelegate); //测深,整数
ui.tableView->setItemDelegateForColumn(1, &floatSpinDelegate); //浮点数
ui.tableView->setItemDelegateForColumn(2, &floatSpinDelegate); //浮点数
ui.tableView->setItemDelegateForColumn(3, &floatSpinDelegate); //浮点数
ui.tableView->setItemDelegateForColumn(4, &comboBoxDelegate); //Combbox选择型
resetTable(5); //表格复位
setCentralWidget(ui.tabWidget); //
//创建状态栏组件
LabCellPos = new QLabel("当前单元格:", this);
LabCellPos->setMinimumWidth(180);
LabCellPos->setAlignment(Qt::AlignHCenter);
LabCellText = new QLabel("单元格内容:", this);
LabCellText->setMinimumWidth(200);
ui.statusBar->addWidget(LabCellPos);
ui.statusBar->addWidget(LabCellText);
}
//表格复位,先删除所有行,再设置新的行数,表头不变
void sample7_2binFile::resetTable(int aRowCount)
{
//QStringList headerList;
//headerList<<"测深(m)"<<"垂深(m)"<<"方位(°)"<<"总位移(m)"<<"固井质量"<<"测井取样";
//theModel->setHorizontalHeaderLabels(headerList);//设置表头文字
theModel->removeRows(0, theModel->rowCount());//删除所有行
theModel->setRowCount(aRowCount);//设置新的行数
QString str = theModel->headerData(theModel->columnCount() - 1,
Qt::Horizontal, Qt::DisplayRole).toString();
for (int i = 0; i < theModel->rowCount(); i++)
{ //设置最后一列
QModelIndex index = theModel->index(i, FixedColumnCount - 1);//获取模型索引
QStandardItem* aItem = theModel->itemFromIndex(index);//获取item
aItem->setCheckable(true);
aItem->setData(str, Qt::DisplayRole);
aItem->setEditable(false);//不可编辑
}
}
//将模型数据保存为Qt预定义编码的数据文件
bool sample7_2binFile::saveDataAsStream(QString &aFileName)
{
QFile aFile(aFileName); //以文件方式读出
if (!(aFile.open(QIODevice::WriteOnly | QIODevice::Truncate)))
return false;
QDataStream aStream(&aFile);
aStream.setVersion(QDataStream::Qt_5_8); //设置版本号,写入和读取的版本号要兼容
qint16 rowCount = theModel->rowCount(); //数据模型行数
qint16 colCount = theModel->columnCount(); //数据模型列数
aStream << rowCount; //写入文件流,行数
aStream << colCount;//写入文件流,列数
//获取表头文字
for (int i = 0; i < theModel->columnCount(); i++)
{
QString str = theModel->horizontalHeaderItem(i)->text();//获取表头文字
aStream << str; //字符串写入文件流,Qt预定义编码方式
}
//获取数据区的数据
for (int i = 0; i < theModel->rowCount(); i++)
{
QStandardItem* aItem = theModel->item(i, 0); //测深
qint16 ceShen = aItem->data(Qt::DisplayRole).toInt();
aStream << ceShen;// 写入文件流,qint16
aItem = theModel->item(i, 1); //垂深
qreal chuiShen = aItem->data(Qt::DisplayRole).toFloat();
aStream << chuiShen;//写入文件流, qreal
aItem = theModel->item(i, 2); //方位
qreal fangWei = aItem->data(Qt::DisplayRole).toFloat();
aStream << fangWei;//写入文件流, qreal
aItem = theModel->item(i, 3); //位移
qreal weiYi = aItem->data(Qt::DisplayRole).toFloat();
aStream << weiYi;//写入文件流, qreal
aItem = theModel->item(i, 4); //固井质量
QString zhiLiang = aItem->data(Qt::DisplayRole).toString();
aStream << zhiLiang;// 写入文件流,字符串
aItem = theModel->item(i, 5); //测井
bool quYang = (aItem->checkState() == Qt::Checked);
aStream << quYang;// 写入文件流,bool型
}
aFile.close();
return true;
}
//从Qt预定义流文件读入数据
bool sample7_2binFile::openDataAsStream(QString &aFileName)
{
QFile aFile(aFileName); //以文件方式读出
if (!(aFile.open(QIODevice::ReadOnly)))
return false;
QDataStream aStream(&aFile); //用文本流读取文件
aStream.setVersion(QDataStream::Qt_5_8); //设置流文件版本号
qint16 rowCount, colCount;
aStream >> rowCount; //读取行数
aStream >> colCount; //列数
this->resetTable(rowCount); //表格复位
//获取表头文字
QString str;
for (int i = 0; i < colCount; i++)
aStream >> str; //读取表头字符串
//获取数据区文字,
qint16 ceShen;
qreal chuiShen;
qreal fangWei;
qreal weiYi;
QString zhiLiang;
bool quYang;
QStandardItem *aItem;
QModelIndex index;
for (int i = 0; i < rowCount; i++)
{
aStream >> ceShen;//读取测深, qint16
index = theModel->index(i, 0);
aItem = theModel->itemFromIndex(index);
aItem->setData(ceShen, Qt::DisplayRole);
aStream >> chuiShen;//垂深,qreal
index = theModel->index(i, 1);
aItem = theModel->itemFromIndex(index);
aItem->setData(chuiShen, Qt::DisplayRole);
aStream >> fangWei;//方位,qreal
index = theModel->index(i, 2);
aItem = theModel->itemFromIndex(index);
aItem->setData(fangWei, Qt::DisplayRole);
aStream >> weiYi;//位移,qreal
index = theModel->index(i, 3);
aItem = theModel->itemFromIndex(index);
aItem->setData(weiYi, Qt::DisplayRole);
aStream >> zhiLiang;//固井质量,QString
index = theModel->index(i, 4);
aItem = theModel->itemFromIndex(index);
aItem->setData(zhiLiang, Qt::DisplayRole);
aStream >> quYang;//bool
index = theModel->index(i, 5);
aItem = theModel->itemFromIndex(index);
if (quYang)
aItem->setCheckState(Qt::Checked);
else
aItem->setCheckState(Qt::Unchecked);
}
aFile.close();
return true;
}
//保存为纯二进制文件
bool sample7_2binFile::saveBinaryFile(QString &aFileName)
{
QFile aFile(aFileName); //以文件方式读出
if (!(aFile.open(QIODevice::WriteOnly)))
return false;
QDataStream aStream(&aFile); //用文本流读取文件
// aStream.setVersion(QDataStream::Qt_5_9); //无需设置数据流的版本
aStream.setByteOrder(QDataStream::LittleEndian);//windows平台
// aStream.setByteOrder(QDataStream::BigEndian);//QDataStream::LittleEndian
qint16 rowCount = theModel->rowCount();
qint16 colCount = theModel->columnCount();
aStream.writeRawData((char *)&rowCount, sizeof(qint16)); //写入文件流
aStream.writeRawData((char *)&colCount, sizeof(qint16));//写入文件流
//获取表头文字
QByteArray btArray;
QStandardItem *aItem;
for (int i = 0; i < theModel->columnCount(); i++)
{
aItem = theModel->horizontalHeaderItem(i); //获取表头item
QString str = aItem->text(); //获取表头文字
btArray = str.toUtf8(); //转换为字符数组
aStream.writeBytes(btArray, btArray.length()); //写入文件流,长度uint型,然后是字符串内容
}
//获取数据区文字,
qint8 yes = 1, no = 0; //分别代表逻辑值 true和false
for (int i = 0; i < theModel->rowCount(); i++)
{
aItem = theModel->item(i, 0); //测深
qint16 ceShen = aItem->data(Qt::DisplayRole).toInt();//qint16类型
aStream.writeRawData((char *)&ceShen, sizeof(qint16));//写入文件流
aItem = theModel->item(i, 1); //垂深
qreal chuiShen = aItem->data(Qt::DisplayRole).toFloat();//qreal 类型
aStream.writeRawData((char *)&chuiShen, sizeof(qreal));//写入文件流
aItem = theModel->item(i, 2); //方位
qreal fangWei = aItem->data(Qt::DisplayRole).toFloat();
aStream.writeRawData((char *)&fangWei, sizeof(qreal));
aItem = theModel->item(i, 3); //位移
qreal weiYi = aItem->data(Qt::DisplayRole).toFloat();
aStream.writeRawData((char *)&weiYi, sizeof(qreal));
aItem = theModel->item(i, 4); //固井质量
QString zhiLiang = aItem->data(Qt::DisplayRole).toString();
btArray = zhiLiang.toUtf8();
aStream.writeBytes(btArray, btArray.length()); //写入长度,uint,然后是字符串
//aStream.writeRawData(btArray,btArray.length());//对于字符串,应使用writeBytes()函数
aItem = theModel->item(i, 5); //测井取样
bool quYang = (aItem->checkState() == Qt::Checked); //true or false
if (quYang)
aStream.writeRawData((char *)&yes, sizeof(qint8));
else
aStream.writeRawData((char *)&no, sizeof(qint8));
}
aFile.close();
return true;
}
//打开二进制文件
bool sample7_2binFile::openBinaryFile(QString &aFileName)
{
QFile aFile(aFileName); //以文件方式读出
if (!(aFile.open(QIODevice::ReadOnly)))
return false;
QDataStream aStream(&aFile); //用文本流读取文件
// aStream.setVersion(QDataStream::Qt_5_9); //设置数据流的版本
aStream.setByteOrder(QDataStream::LittleEndian);
// aStream.setByteOrder(QDataStream::BigEndian);
qint16 rowCount, colCount;
aStream.readRawData((char *)&rowCount, sizeof(qint16));
aStream.readRawData((char *)&colCount, sizeof(qint16));
this->resetTable(rowCount);
//获取表头文字,但是并不利用
char *buf;
uint strLen; //也就是 quint32
for (int i = 0; i < colCount; i++)
{
aStream.readBytes(buf, strLen);//同时读取字符串长度,和字符串内容
QString str = QString::fromLocal8Bit(buf, strLen); //可处理汉字
}
//获取数据区数据
QStandardItem *aItem;
qint16 ceShen;
qreal chuiShen;
qreal fangWei;
qreal weiYi;
QString zhiLiang;
qint8 quYang; //分别代表逻辑值 true和false
QModelIndex index;
for (int i = 0; i < rowCount; i++)
{
aStream.readRawData((char *)&ceShen, sizeof(qint16)); //测深
index = theModel->index(i, 0);
aItem = theModel->itemFromIndex(index);
aItem->setData(ceShen, Qt::DisplayRole);
aStream.readRawData((char *)&chuiShen, sizeof(qreal)); //垂深
index = theModel->index(i, 1);
aItem = theModel->itemFromIndex(index);
aItem->setData(chuiShen, Qt::DisplayRole);
aStream.readRawData((char *)&fangWei, sizeof(qreal)); //方位
index = theModel->index(i, 2);
aItem = theModel->itemFromIndex(index);
aItem->setData(fangWei, Qt::DisplayRole);
aStream.readRawData((char *)&weiYi, sizeof(qreal)); //位移
index = theModel->index(i, 3);
aItem = theModel->itemFromIndex(index);
aItem->setData(weiYi, Qt::DisplayRole);
aStream.readBytes(buf, strLen);//固井质量
zhiLiang = QString::fromLocal8Bit(buf, strLen);
index = theModel->index(i, 4);
aItem = theModel->itemFromIndex(index);
aItem->setData(zhiLiang, Qt::DisplayRole);
aStream.readRawData((char *)&quYang, sizeof(qint8)); //测井取样
index = theModel->index(i, 5);
aItem = theModel->itemFromIndex(index);
if (quYang == 1)
aItem->setCheckState(Qt::Checked);
else
aItem->setCheckState(Qt::Unchecked);
}
aFile.close();
return true;
}
void sample7_2binFile::on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
{
Q_UNUSED(previous);
if (current.isValid())
{
LabCellPos->setText(QString::asprintf("当前单元格:%d行,%d列",
current.row(), current.column()));
QStandardItem *aItem;
aItem = theModel->itemFromIndex(current); //从模型索引获得Item
this->LabCellText->setText("单元格内容:" + aItem->text());
QFont font = aItem->font();
//ui.actFontBold->setChecked(font.bold());
}
}
void sample7_2binFile::on_actOpen_triggered()
{
QString curPath = QDir::currentPath();
//调用打开文件对话框打开一个文件
QString aFileName = QFileDialog::getOpenFileName(this, tr("打开一个文件"), curPath,
"流数据文件(*.stm)");
if (aFileName.isEmpty())
return; //
if (openDataAsStream(aFileName)) //保存为流数据文件
QMessageBox::information(this, "提示消息", "文件已经打开!");
}
//添加行
void sample7_2binFile::on_actAppend_triggered()
{
QList<QStandardItem*> aItemList; //容器类
QStandardItem *aItem;
QString str;
for (int i = 0; i < FixedColumnCount - 2; i++)
{
aItem = new QStandardItem("0"); //创建Item
aItemList << aItem; //添加到容器
}
aItem = new QStandardItem("优"); //创建Item
aItemList << aItem; //添加到容器
str = theModel->headerData(theModel->columnCount() - 1, Qt::Horizontal, Qt::DisplayRole).toString();
aItem = new QStandardItem(str); //创建Item
aItem->setCheckable(true);
aItem->setEditable(false);
aItemList << aItem; //添加到容器
theModel->insertRow(theModel->rowCount(), aItemList); //插入一行,需要每个Cell的Item
QModelIndex curIndex = theModel->index(theModel->rowCount() - 1, 0);//创建最后一行的ModelIndex
theSelection->clearSelection();
theSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);
}
//插入行
void sample7_2binFile::on_actInsert_triggered()
{
QList<QStandardItem*> aItemList; //QStandardItem的容器类
QStandardItem *aItem;
QString str;
for (int i = 0; i < FixedColumnCount - 2; i++)
{
aItem = new QStandardItem("0"); //新建一个QStandardItem
aItemList << aItem;//添加到容器类
}
aItem = new QStandardItem("优"); //新建一个QStandardItem
aItemList << aItem;//添加到容器类
str = theModel->headerData(theModel->columnCount() - 1, Qt::Horizontal, Qt::DisplayRole).toString();
aItem = new QStandardItem(str); //创建Item
aItem->setCheckable(true);
aItem->setEditable(false);
aItemList << aItem;//添加到容器类
QModelIndex curIndex = theSelection->currentIndex();
theModel->insertRow(curIndex.row(), aItemList);
theSelection->clearSelection();
theSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);
}
//删除行
void sample7_2binFile::on_actDelete_triggered()
{
QModelIndex curIndex = theSelection->currentIndex();
if (curIndex.row() == theModel->rowCount() - 1)//(curIndex.isValid())
theModel->removeRow(curIndex.row());
else
{
theModel->removeRow(curIndex.row());
theSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);
}
}
//以Qt预定义编码保存数据文件
void sample7_2binFile::on_actSave_triggered()
{
QString curPath = QDir::currentPath();
QString aFileName = QFileDialog::getSaveFileName(this, tr("选择保存文件"), curPath,
"Qt预定义编码数据文件(*.stm)");
if (aFileName.isEmpty())
return; //
if (saveDataAsStream(aFileName)) //保存为流数据文件
QMessageBox::information(this, "提示消息", "文件已经成功保存!");
}
void sample7_2binFile::on_actAlignCenter_triggered()
{
if (!theSelection->hasSelection())
return;
QModelIndexList selectedIndix = theSelection->selectedIndexes();
QModelIndex aIndex;
QStandardItem *aItem;
for (int i = 0; i < selectedIndix.count(); i++)
{
aIndex = selectedIndix.at(i);
aItem = theModel->itemFromIndex(aIndex);
aItem->setTextAlignment(Qt::AlignHCenter);
}
}
void sample7_2binFile::on_actFontBold_triggered(bool checked)
{
if (!theSelection->hasSelection())
return;
QModelIndexList selectedIndix = theSelection->selectedIndexes();
QModelIndex aIndex;
QStandardItem *aItem;
QFont font;
for (int i = 0; i < selectedIndix.count(); i++)
{
aIndex = selectedIndix.at(i);
aItem = theModel->itemFromIndex(aIndex);
font = aItem->font();
font.setBold(checked);
aItem->setFont(font);
}
}
void sample7_2binFile::on_actAlignLeft_triggered()
{
if (!theSelection->hasSelection())
return;
QModelIndexList selectedIndix = theSelection->selectedIndexes();
QModelIndex aIndex;
QStandardItem *aItem;
for (int i = 0; i < selectedIndix.count(); i++)
{
aIndex = selectedIndix.at(i);
aItem = theModel->itemFromIndex(aIndex);
aItem->setTextAlignment(Qt::AlignLeft);
}
}
void sample7_2binFile::on_actAlignRight_triggered()
{
if (!theSelection->hasSelection())
return;
QModelIndexList selectedIndix = theSelection->selectedIndexes();
QModelIndex aIndex;
QStandardItem *aItem;
for (int i = 0; i < selectedIndix.count(); i++)
{
aIndex = selectedIndix.at(i);
aItem = theModel->itemFromIndex(aIndex);
aItem->setTextAlignment(Qt::AlignRight);
}
}
//表格复位
void sample7_2binFile::on_actTabReset_triggered()
{
resetTable(10);
}
//保存二进制文件
void sample7_2binFile::on_actSaveBin_triggered()
{
QString curPath = QDir::currentPath();
//调用打开文件对话框选择一个文件
QString aFileName = QFileDialog::getSaveFileName(this, tr("选择保存文件"), curPath,
"二进制数据文件(*.dat)");
if (aFileName.isEmpty())
return; //
if (saveBinaryFile(aFileName)) //保存为流数据文件
QMessageBox::information(this, "提示消息", "文件已经成功保存!");
}
//打开二进制文件
void sample7_2binFile::on_actOpenBin_triggered()
{
QString curPath = QDir::currentPath();//系统当前目录
QString aFileName = QFileDialog::getOpenFileName(this, tr("打开一个文件"), curPath,
"二进制数据文件(*.dat)");
if (aFileName.isEmpty())
return; //
if (openBinaryFile(aFileName)) //保存为流数据文件
{
QMessageBox::information(this, "提示消息", "文件已经打开!");
}
}
//退出
void sample7_2binFile::on_actExit_triggered()
{
this->close();
}
main.ccp 文件
#include "sample7_2binFile.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
sample7_2binFile w;
w.show();
return a.exec();
}
运行结果:

《Qt5/6 C++开发指南》
2281

被折叠的 条评论
为什么被折叠?



