本文紧接着上一文介绍如何对用户模型剩下的类进行实现,并将其集成到视图并显示出来。
QAbstractItemModel
- insertRows(int row, int count, const QModelIndex &parent)
该函数实现一次性向表格之中从row位置开始插入count行,一个简单的实现手段是:
{
if(row<0 || row>m_dataVector->size() || count<1) return false;
beginInsertRows(parent, row, row + count - 1);
for (quint8 i=0;i<count;i++)
{
QPair<QString,int> newPair{
};
m_dataVector->insert(row+i,newPair);
}
endInsertRows();
return true;
}
- insertColumns(int column, int count, const QModelIndex &parent)
由于表格固定是两列,所以此处不做处理。
{
beginInsertColumns(parent, column, column + count - 1);
endInsertColumns();
return false;
}
- removeRows(int row, int count, const QModelIndex &parent)
删除行与前面的方法类似,此处一个简单实现如下:
{
if(row<0 || row>m_dataVector->size() || count<1 ) return false;
beginRemoveRows(parent, row, row + count - 1);
for (quint8 i=0;i<count;i++)
{
if(m_dataVector->size()==0) return true; //判断是否已经删除完,如果已完,提前退出
m_dataVector->remove(row);
}
endRemoveRows();
return true;
}
- removeColumns(int column, int count, const QModelIndex &parent)
类似的,此处也不需要对删除列进行操作:
{
beginRemoveColumns(parent, column, column + count - 1);
// FIXME: Implement me!
endRemoveColumns();
return false;
}
下一步构造一个简单的视图,实现对数据的显示。进入main.cpp,对前期的界面显示代码进行注释:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// mainWindow w;
// w.show();
包含需要的头文件:
#include <QTableView>
#include "customtableview.h"
此处使用标准的QTableView来显示图标,构建一个视图,构建一个用户模型示例并将其设置为视图的模型,最后显示视图。
QTableView view; //构造视图
CustomItemModel model; //构造模型
view.setModel(&model); //设置视图的模型
view.show(); //显示视图
编译运行代码,显示表格:
再在用户模型之中加入一个写入数据的槽函数:
void CustomItemModel::pushData(QString &name, int &age)
{
m_dataVector->push_back(QPair<QString,int>(name,age));
m_checked.push_back(QPair<bool,bool>(false,false));
emit dataChanged(
createIndex(m_dataVector->size()-1,0),
createIndex(m_dataVector->size()-1,1),
QVector<int>() << Qt::DisplayRole<<Qt::CheckStateRole
);
}
调用对象的槽函数,写入几个测试数据:
model.pushData("Jim",28);
model.pushData("White",72);
运行模型:
后面我对数据其他一些角色进行修改,增加一个图标显示,比如Name列显示红色,Age列显示绿色。
case Qt::DecorationRole://The data to be rendered as a decoration in the form of an icon. (QColor, QIcon or QPixmap)
{
if(index.column()==0) return QColor(255,0,0,255); //Name显示 红色
if(index.column()==1) return QColor(0,255,0,255); //Age列显示绿色
}
运行代码:
再给每个条目显示一个勾选框:
为了方便交互,需要一个数据结构来记录勾选状态:
QVector<QPair<bool,bool>> m_checked{
}; //储存某个位置是否被勾选
根据数据设置条目勾选状态:
case Qt::CheckStateRole:
{
if(index.column()==0)
{
if(m_checked.at(index.row()).first) return Qt::Checked;
else return Qt::Unchecked;