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 &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 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 static inline T *qGetPtrHelper(T *ptr) { return ptr; }

 

在QObject中定义了d_ptr

QScopedPointer 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 d_ptr; // 指向节点持有的数据QStandItemPrivate

}

 

QStandardItemPrivate的结构是:

{

    QStandardItemModel *model; // 指向归属Model

    QStandardItem *parent;     // 指向父节点

QVector values; // 存储节点的数据:包括ItemDataRole对应的各种数据,例如DisplayRole等

// ItemDataRole (DisplayRole|EditRole|BackgroundRole|TextAlignmentRole...)

    QVector 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 items;

        QStandardItem* item = new QStandardItem("123");

        items.push_back(item);

        topItem->appendRow(items);

 

        for (int j=0; j< 3; j++)

        {

            // 创建二层下的三层节点

            QList 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)


你可能感兴趣的:(Qt)