前言
平时用Qt的QTableWidget,后面感觉数据多的时候就改用QTableView了,model用的Qt自带的QStandardItemModel,但是数据过多还是会卡顿,而且QStandardItemModel功能很多,里面很多自己用不到的信号和槽,所以后面基于QAbstractTableModel自定义了自己的模型TableModel。
实现效果
插入一百万条数据,大概需要5s左右吧,然后设置单双行背景不一样,点击表格项显示提示信息。注意这里添加数据的时候不是一条一条数据添加的,因为循环调用==beginResetModel()和endResetModel()==函数就会很卡。所以我是自定义了一个函数,可以一次新建多行数据。
需要实现的函数
想要自己的自定义Model能用起来,就必须实现基类QAbstractTableModel里的一些接口。如下:
// 返回行数
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
// 返回列数
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
// 根据模型索引返回当前的数据
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
// 设置表格是否可编辑
Qt::ItemFlags flags(const QModelIndex &index) const override;
// 设置value数据给index处的role角色
bool setData(const QModelIndex& index, const QVariant &value, int role=Qt::EditRole) override;
// 返回表头
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
rowCount接口返回的是行数,我是将数据存到QList里,然后返回这个QList的size();
columnCount接口返回的是列数,我是将水平表头保存到QStringList里,然后返回这个QStringList的size();
data接口比较重要,表格会一直调用该函数来获取当前数据以及一些其他信息;
flags接口影响表格是否可编辑,如果自定义表格需要双击表格可编辑数据的话,需要实现该接口和setData接口,后者用来处理编辑表格后数据怎么保存;
headerData返回水平方向或者垂直方向的表头。
以上所有接口都定义好之后自己的自定义TableModel基本就可以用了,后面的大部分自定义函数基本都是针对数据进行处理。
int MyTableModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
return 0;
} else {
return m_datas.size();
}
}
int MyTableModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
return 0;
} else {
return m_HorizontalHead.size();
}
}
QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {
return QVariant();
}
if (role == Qt::DisplayRole || role == Qt::EditRole) {
return m_datas[index.row()][index.column()];//数据的呈现形式
}else if(role == Qt::BackgroundColorRole){
if(index.row() % 2 == 0)
return QColor(192,192,192);//单元格背景色
else
return QColor(159,252,252);//单元格背景色
}
else if (role == Qt::TextAlignmentRole) {
//对其方式
return Qt::AlignCenter;
}
else if(role == Qt::ToolTipRole){
return m_datas[index.row()][index.column()];//数据的提示信息
}
return QVariant();
}
Qt::ItemFlags MyTableModel::flags(const QModelIndex &index)