abstracttablemodel(QAbstractTableModel的使用方法)

发布时间:2025-12-11 01:26:38 浏览次数:1

QAbstractTableModel 结合 QTableView 使用,是QTableView的呈现的数据存储。继承QAbstractTableModel 必须重载以下几个纯虚函数(这些函数来自 QAbstractTableModel 的父类 QAbstractItemModel) :

Q_INVOKABLEvirtualintrowCount(constQModelIndex&parent=QModelIndex())const;Q_INVOKABLEvirtualintcolumnCount(constQModelIndex&parent=QModelIndex())const;Q_INVOKABLEvirtualQVariantdata(constQModelIndex&index,introle=Qt::DisplayRole)const;

其中 data 函数用来填充QTableView 每一个单元格内容。其 role 虽为int类型,但实际的值为 Qt::ItemDataRole 枚举类型 ,如下图:

简单的例子:

//tablemodel.h#include<QAbstractTableModel>#include<QStringList>#include<QVariant>#defineOVERLOAD_QT_CLASS_FUNCTION_DEGIN#defineOVERLOAD_QT_CLASS_FUNCTION_ENDclassCTableModel:publicQAbstractTableModel{Q_OBJECTpublic:/***@briefTheTRowDatastruct行数据*/structTRowData{QStringsItem1;QStringsItem2;QStringsItem3;QStringsItem4;};private:/***@briefTheTHeaderDatastruct表头数据*/structTHeaderData{Qt::OrientationeOrientation;///<水平方向或者竖直方向QVariantoMetaData;///<原生数据intiRole;///<表头数据};public:explicitCTableModel(QObject*parent);voidSetHeader(constQStringList&_clstHeader);voidSetContentData(constQVector<TRowData>&_cvTableData);OVERLOAD_QT_CLASS_FUNCTION_DEGIN/***@briefsetHeaderData该函数为QAbstractItemModel的虚函数,其内部功能未实现,若想使用需要手动重载*@paramsection*@paramorientation*@paramvalue*@paramrole*@return*/virtualboolsetHeaderData(intsection,Qt::Orientationorientation,constQVariant&value,introle=Qt::EditRole)override;Q_INVOKABLEvirtualintrowCount(constQModelIndex&parent=QModelIndex())constoverride;Q_INVOKABLEvirtualintcolumnCount(constQModelIndex&parent=QModelIndex())constoverride;Q_INVOKABLEvirtualQVariantdata(constQModelIndex&index,introle=Qt::DisplayRole)constoverride;Q_INVOKABLEvirtualQVariantheaderData(intsection,Qt::Orientationorientation,introle=Qt::DisplayRole)constoverride;OVERLOAD_QT_CLASS_FUNCTION_ENDprivate:QHash<int,THeaderData>m_hashSection2HHeader;///<水平表头数据QHash<int,THeaderData>m_hashSection2VHeader;///<垂直表头数据QVector<TRowData>m_vtRowData;///<数据表intm_iColumnCount;///<表头字段};
//tablemodel.cpp#include"tablemodel.h"CTableModel::CTableModel(QObject*parent):QAbstractTableModel(parent){}voidCTableModel::SetHeader(constQStringList&_clstHeader){m_iColumnCount=_clstHeader.size();for(inti=0;i<_clstHeader.size();i++){QStringsHeader=_clstHeader.at(i);qDebug()<<this->setHeaderData(i,Qt::Horizontal,sHeader,Qt::DisplayRole);}}voidCTableModel::SetContentData(constQVector<CTableModel::TRowData>&_cvTableData){QAbstractItemModel::beginResetModel();m_vtRowData=_cvTableData;QAbstractItemModel::endResetModel();}boolCTableModel::setHeaderData(intsection,Qt::Orientationorientation,constQVariant&value,introle){if(section<m_iColumnCount){THeaderDatatData;tData.eOrientation=Qt::Horizontal;tData.iRole=Qt::DisplayRole;tData.oMetaData=value;m_hashSection2HHeader[section]=tData;emitheaderDataChanged(Qt::Horizontal,section,section);returntrue;}else{returnfalse;}}intCTableModel::rowCount(constQModelIndex&parent)const{returnm_vtRowData.size();}intCTableModel::columnCount(constQModelIndex&parent)const{returnm_iColumnCount;}QVariantCTableModel::data(constQModelIndex&index,introle)const{if(role==Qt::DisplayRole){intiRow=index.row();intiColumn=index.column();if(iColumn<4&&iRow<m_vtRowData.size()){switch(iColumn){case0:returnm_vtRowData[iRow].sItem1;case1:returnm_vtRowData[iRow].sItem2;case2:returnm_vtRowData[iRow].sItem3;case3:returnm_vtRowData[iRow].sItem4;default:returnQVariant();}}returnQVariant();}elseif(role==Qt::TextAlignmentRole){returnQt::AlignCenter;}returnQVariant();}QVariantCTableModel::headerData(intsection,Qt::Orientationorientation,introle)const{if(section<m_iColumnCount){switch(role){caseQt::DisplayRole:{switch(orientation){caseQt::Horizontal:{if(m_hashSection2HHeader.contains(section)){returnm_hashSection2HHeader[section].oMetaData;}else{returnQVariant();}}caseQt::Vertical:default:returnQVariant();}}default:returnQVariant();}}else{returnQVariant();}}

调用 CTableModel:

m_pModel=newCTableModel(ui->tableView);QStringListlstHeader={"测试1","测试1","测试1","测试1"};m_pModel->SetHeader(lstHeader);ui->tableView->setModel(m_pModel);QVector<CTableModel::TRowData>vtModelData;for(inti=0;i<10;i++){CTableModel::TRowDatatData;tData.sItem1=QString("数据%1_%2").arg(i).arg(1);tData.sItem2=QString("数据%1_%2").arg(i).arg(2);tData.sItem3=QString("数据%1_%2").arg(i).arg(3);tData.sItem4=QString("数据%1_%2").arg(i).arg(4);vtModelData.push_back(tData);}m_pModel->SetContentData(vtModelData);

到此,相信大家对“QAbstractTableModel的使用方法”有了更深的了解,不妨来实际操作一番吧!这里是本站网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

abstracttablemodel
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477