QAbstractTableModel最簡單的應用
阿新 • • 發佈:2018-11-04
QAbstractTableModel 是 Qt 中的一個抽象類(繼承於QAbstractItemModel),在某些應用場景下我們可能會繼承該類來實現一些特殊業務邏輯。
例如:有時候我們的模型中某列儲存的資料是整數型別,但是顯示在檢視中的時候是需要顯示成字串,這時候 QAbstractTableModel 就派上用場了。即通過map來對映,在data方法中處理。以下程式碼實現最簡單的應用,即不提供外部修改介面,只提供資料。
modelex.h
#ifndef MODELEX_H #define MODELEX_H #include <QAbstractTableModel> #include <QMap> #include <QVector> class ModelEx : public QAbstractTableModel { Q_OBJECT public: explicit ModelEx(QObject *parent=nullptr); virtual int columnCount(const QModelIndex &parent) const; virtual int rowCount(const QModelIndex &parent) const; virtual QVariant data(const QModelIndex &index, int role) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; private: //軍種,種類,武器數量;前兩者需要對映 QVector<short>army; QVector<short>weaponType; QStringList weaponNumber; QStringList header; //對映 QMap<short,QString>armyMap; QMap<short,QString>weaponTypeMap; //初始化對映 void initMap(); //內部填充資料的方法 void populateData(); }; #endif // MODELEX_H
modelex.cpp
#include "modelex.h" ModelEx::ModelEx(QObject *parent) : QAbstractTableModel(parent) { initMap(); populateData(); } int ModelEx::columnCount(const QModelIndex &parent) const { //固定三列 return 3; } int ModelEx::rowCount(const QModelIndex &parent) const { return army.size(); } QVariant ModelEx::data(const QModelIndex &index, int role) const { if(!index.isValid()){ return QVariant(); } if(role==Qt::DisplayRole){ switch(index.column()){ case 0: return armyMap[army[index.row()]]; break; case 1: return weaponTypeMap[weaponType[index.row()]]; break; case 2: return weaponNumber[index.row()]; break; default: return QVariant(); } } return QVariant(); } QVariant ModelEx::headerData(int section, Qt::Orientation orientation, int role) const { if(orientation==Qt::Horizontal&&role==Qt::DisplayRole){ return header.at(section); }else{ return QAbstractTableModel::headerData(section,orientation,role); } } void ModelEx::initMap() { //兵種對映 armyMap[0] = tr("海軍"); armyMap[1] = tr("陸軍"); armyMap[2] = tr("空軍"); armyMap[3] = tr("海軍陸戰隊"); //武器型別 weaponTypeMap[0] = tr("左輪"); weaponTypeMap[1] = tr("AK"); weaponTypeMap[2] = tr("98K"); weaponTypeMap[3] = tr("AWM"); weaponTypeMap[4] = tr("SKS射手步槍"); weaponTypeMap[5] = tr("M24"); } void ModelEx::populateData() { header<<tr("軍種")<<tr("武器")<<tr("武器數量"); army<<0<<1<<2<<3<<2<<1; weaponType<<0<<1<<2<<3<<4<<5; weaponNumber<<tr("123")<<tr("235")<<tr("5673")<<tr("111")<<tr("34")<<tr("99"); }
main.cpp
#include <QApplication> #include <QTableView> #include <modelex.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTableView view; ModelEx model; view.setModel(&model); view.resize(300,300); view.show(); return a.exec(); }