Qt Model/View理解(二)---構造model
阿新 • • 發佈:2019-02-07
資料是一個集合,顯示也是一個集合。例如一篇《西遊記》的文章,所有的文字就是資料集合,展示方式就是顯示的集合,可以以書本的形式,也可以以電紙書的形式,更可以用視訊的方式展現。
下面是將一個二維陣列中的資料顯示到TableView控制元件中。
1.宣告一個model類,繼承於QAbstractTableModel
#define ROW 3 #define COL 2 class TableModel : public QAbstractTableModel { Q_OBJECT public: TableModel(QObject *parent = 0); ~TableModel(); //QAbstractTableModel 中3個必須重新實現的虛擬函式 int rowCount(const QModelIndex & parent = QModelIndex()) const; int columnCount(const QModelIndex & parent = QModelIndex()) const; QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; private: int num[ROW][COL]; int nn; };
2.方法實現
TableModel::TableModel(QObject *parent) :QAbstractTableModel(parent) { //二維數初始化,從100開始 nn = 100; for(int i=0;i<ROW;++i){ for(int j=0;j<COL;++j){ num[i][j] = nn; ++nn; } } } TableModel::~TableModel() { } //體現model的行數,這裡有3行 int TableModel::rowCount(const QModelIndex & parent) const { return ROW; } //體現model的列數,這裡有2列 int TableModel::columnCount(const QModelIndex & parent) const { return COL; } //體現model中顯示的資料,這裡只是num中每一個成員值。 QVariant TableModel::data(const QModelIndex & index, int role) const { if (Qt::DisplayRole == role) { return num[index.row()][index.column()];//返回num二維陣列中的值 } return QVariant::Invalid; }
3.將model與QTableView關聯起來。
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(300,200);
TableModel *model = new TableModel();
QTableView *tableview = new QTableView(this);
tableview->setModel(model);
tableview->setGeometry(5,5,280,180);
}
4.顯示效果,3行2列
目前的實現都是從定義好的model中取出資料,放在不同的顯示控制元件中,相當於只讀,沒有對資料部分做任何修改。下一節將以此篇為基礎,介紹如何對資料部分進行操作。