QStandardItemModel(QColumnView)小總結
類QAbstractItemModel,QAbstractListModel,QAbstractTableModel不儲存資料,
使用者需要從這些類派生出子類,并在子類中定義某種資料結構來儲存資料。與此不同,類QStandardItemModel
負責儲存資料,每個資料項被儲存為類QStandardItem的對象。在QStandardItem内部定義了一個類型為QVector
的容器,每個容器元素本質上存放一個[角色,資料子項]對,它也定義了一個名為root的資料成員。
将資料存放在QStandardItem對象中:
void setData(const QVariant &value, int role);
從QStandardItem對象中讀取資料:
QVariant data(int role) const;
若資料集被表示為一個清單: //清單被看做特殊的樹:不可見根具有若幹個子節點,子節點不再含其他節點
QStandardItemModel listModel;
QStandardItem *rootItem = listModel.invisibleRootItem(); //不可見的根節點
for(int row = 0; row < 4; ++row){
QStandardItem *item = new QStandardItem(QString("%0").arg(row)); //建立一個标準項
rootItem->appendRow(item); //添加一項
}
QListView listView;
listView.setModel(&listModel);
若資料集被表示為一個表格:
QStandardItemModel tableModel(4,4); //行列數
for(int row = 0; row < 4; ++row){
for(int column = 0; column < 4; ++column){
QStandardItem *item = new QStandardItem(
QString("%0,%1").arg(row).arg(column));
tableModel.setItem(row,column,item); //table
}
}
QTableView tableView;
tableView.setModel(&tableModel);
若資料集是一棵樹:
QStandardItemModel treeModel;
QStandardItem *parentItem = treeModel.invisibleRootItem();
for(int i = 0; i < 4; ++i){
QStandardItem *item = new QStandardItem(QString("%0").arg(i));
parentItem->appendRow(item);
parentItem = item;
}
QTreeView treeView;
treeView.setModel(&treeModel);
/********************************************************************************************/
#include "widget.h"
#include <QtGui>
#include <QApplication>
#include <QFileSystemModel>
#include <QColumnView>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QFileSystemModel model;
model.setRootPath("C:/");
QColumnView *cview = new QColumnView;
cview->setModel(&model);
cview->show();
return app.exec();
}
運作結果: