概述
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:qt源码
qstandarditemmodel_p.h
qstandarditemmodel.h
qstandarditemmodel.cpp
QStandardItemModel用来绑定QTreeView是比较便利的,可以便利的生成树形结构;
这个Model中把每个节点是一个:QStandItem
通过把每一个QModelIndex对应一个QStandItem形成树形数据结构,进而提供树形展示。
QStandardItemModel绑定节点为QStandItem结构:
例如添加元素时
// 使用“不可见的根节点”添加该组子节点 void QStandardItemModel::appendRow(const QList<QStandardItem*> &items) { invisibleRootItem()->appendRow(items); } QStandardItem *QStandardItemModel::invisibleRootItem() const { Q_D(const QStandardItemModel); // 相当于 QStandardItemModelPrivate* const d = d_func(); return d->root.data(); } // QStandardItemModelPrivate包含root定义,构造函数中初始化出节点QStandardItem QStandardItemModelPrivate { QScopedPointer<QStandardItem> root; QStandardItemModelPrivate::QStandardItemModelPrivate() : root(new QStandardItem), … } // QStandardItemModel包含把d_func缺省指向QStandardItemModelPrivate的处理 QStandardItemModel::QStandardItemModel(QObject *parent) : QAbstractItemModel(*new QStandardItemModelPrivate, parent)
// 注:在QAbstractItemModel中, d_func缺省指向QAbstractItemModelPrivate的处理 QAbstractItemModel::QAbstractItemModel(QObject *parent) : QObject(*new QAbstractItemModelPrivate, parent) |
d_func()指向自身d_ptr定义:指向自身QObjectPrivate
// Q_D定义 #define Q_D(Class) Class##Private * const d = d_func()
// = d_func() 相当于 = d_ptr,指向自身的指针 Q_DECLARE_PRIVATE(QStandardItemModel) // d_func定义,d_func返回d_ptr #define Q_DECLARE_PRIVATE(Class) inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }
在QObject中定义了d_ptr QScopedPointer<QObjectData> d_ptr;
QObject构造函数中缺省使用QObjectPrivate来初始化,并把d_ptr.q_ptr指向自身 d_ptr(new QObjectPrivate) d_ptr->q_ptr = this;
在QObjectPrivate结构中,包含q_ptr指向自身的变量指针 class Q_CORE_EXPORT QObjectPrivate : public QObjectData {…} class Q_CORE_EXPORT QObjectData { QObject *q_ptr; QObject *parent; QObjectList children; … }; |
QStandItem的结构是:
{ QScopedPointer<QStandardItemPrivate> d_ptr; // 指向节点持有的数据QStandItemPrivate } |
QStandardItemPrivate的结构是:
{ QStandardItemModel *model; // 指向归属Model QStandardItem *parent; // 指向父节点 QVector<QStandardItemData> values; // 存储节点的数据:包括ItemDataRole对应的各种数据,例如DisplayRole等 // ItemDataRole (DisplayRole|EditRole|BackgroundRole|TextAlignmentRole...) QVector<QStandardItem*> children; // 指向所有的子节点 int rows; // 行数 int columns; // 列数 QStandardItem *q_ptr; // 指向自身所在节点QStandardItem int lastIndexOf; // 上次匹配children到的位置index,缺省2 // 这个变量好像作用不大 } |
从这个结构上可以看出:QStandItem
1. 有自身的数据信息values
2. 有父节点指针 parent
3. 有各个子节点指针children
是典型的树形节点node结构;
例如下面简单的一些处理,就生成了双层的树形结构展示:
// 创建QStandardItemModel QStandardItemModel* pModel = new QStandardItemModel(this); { // 创建首层节点 QStandardItem* topItem = new QStandardItem(); topItem->setData(QString("Root"), Qt::DisplayRole); pModel->appendRow(topItem);
for (int i = 0; i < 3;i++) { // 创建首层下的二层节点 QList<QStandardItem*> items; QStandardItem* item = new QStandardItem("123"); items.push_back(item); topItem->appendRow(items);
for (int j=0; j< 3; j++) { // 创建二层下的三层节点 QList<QStandardItem*> subItems; QStandardItem* subItem = new QStandardItem("456"); subItems.push_back(subItem); item->appendRow(subItems); } } } ui.treeView->setModel(pModel); |
生成的样例如下:
Root
–> 123
–>–>456
–>–>456
–>–>456
–> 123
–>–>456
–>–>456
–>–>456
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
最后
以上就是含糊外套为你收集整理的QStandardItemModel的使用的全部内容,希望文章能够帮你解决QStandardItemModel的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复