我是靠谱客的博主 含糊外套,最近开发中收集的这篇文章主要介绍QStandardItemModel的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

(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的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部