QStandardItemModel的使用
来源:互联网 发布:重庆行知技工学校 编辑:程序博客网 时间:2024/05/16 05:06
(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的使用
- QListView 和 QStandardItemModel的使用
- QListView,QTreeView和 QStandardItemModel的简单使用
- QListView,QTreeView和 QStandardItemModel的简单使用
- QTreeView 使用 QStandardItemModel
- Qt中Qtableview 的使用2(QStandardItemModel模型)
- 使用qstandarditemmodel获取qtableview中复选框的数据
- QStandardItemModel的用法
- QStandardItemModel
- QStandardItemModel
- QStandardItemModel在QTreeView中的使用
- QStandardItemModel 自动被析构的问题
- QStandardItemModel的data线程安全
- Qt编程27:QStandardItemModel与QTreeView的使用(显示目录下文件)
- 使用QStandardItemModel的QTableView,添加大量数据解决刷新卡顿问题
- QStandardItemModel角色控制及QTreeView添加不同的右键菜单
- QStandardItemModel角色控制及QTreeView添加不同的右键菜单
- 基于QStandardItemModel的工程目录实现与响应
- 4、三色棋(Algorithm Gossip)
- 20170828_windows10+openCV3.3+tensorflow1.3gpu版本+python3.6+cuda8.0+cudnn6
- 大数加法 + 斐波那契数列
- 学习日记2017.8.28(万事开头难)
- c++ 11 final, override,const 成员函数
- QStandardItemModel的使用
- 序列化二叉树
- 二叉树的遍历详解
- 【Unity3D】Asset Store 下载的package存在什么地方?
- Eclipse 快捷键大全
- NLP深度学习 —— CS224学习笔记7
- 第五章 数组与字符串 5.2 字符串类
- Java小项目中WEB-INF下jsp页面如何访问?
- Javaweb基础之Servlet学习