在Qt5.5之前是没有树控件的,我们在使用时用的是ListView来构造出一个树,Qt5.5之后的QML开发阶段,有了树控件TreeView,本篇着重记录QML的TreeView的使用。根据MVC分解文件(类)如下:
TreeController.h TreeController.cpp
TreeModel.h TreeModel.cpp
TreeItem.c TreeItem.cpp
各个类职能划分如下:
TreeController主要负责用户的操作,例如加载qml文件,用户主动加载数据,主动删除数据,主动插入数据等。TreeModel主要存放数据(TreeItem为TreeModel的成员,也是存放数据的)。QML的TreeView主要显示数据。
重点在于QML的TreeView与TreeModel如何交互将数据正确显示出来。
TreeModel.h头文件如下:
TreeModel.cpp源文件如下:
TreeController.h TreeController.cpp
TreeModel.h TreeModel.cpp
TreeItem.c TreeItem.cpp
各个类职能划分如下:
TreeController主要负责用户的操作,例如加载qml文件,用户主动加载数据,主动删除数据,主动插入数据等。TreeModel主要存放数据(TreeItem为TreeModel的成员,也是存放数据的)。QML的TreeView主要显示数据。
重点在于QML的TreeView与TreeModel如何交互将数据正确显示出来。
TreeModel.h头文件如下:
class TreeModel : public QAbstractItemModel
{
Q_OBJECT
enum ItemRoles {
NAME = Qt::UserRole + 1,
SIMPLIFY
};
public:
TreeModel(QObject *parent = NULL);
~TreeModel();
void appendChild(const QModelIndex& index);
bool removeRows(int row, int count, QModelIndex parent);
QModelIndex parent(const QModelIndex &index) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
QHash<int, QByteArray> roleNames() const;
private:
TreeItem *m_rootItem;
};
TreeItem.h头文件如下:
#ifndef TREEITEM_H
#define TREEITEM_H
#include <QList>
#include <QVariant>
#include <QStringList>
#include <QModelIndex>
class TreeItem
{
public:
TreeItem::TreeItem();
TreeItem(const QList<QVariant> &data, TreeItem* parent);
~TreeItem();
void appendChild(TreeItem *child);
void deleteAllChild();
TreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
TreeItem *parent();
void setParent(TreeItem *parent);
private:
TreeItem *m_parentItem;
QList<TreeItem*> m_childItems;
QList<QVariant> m_itemData;
};
#endif
可以看出TreeModel是继承自QAbstractItemModel,其中QVariant data(const QModelIndex &index, int role) const;成员函数和QHash<int, QByteArray> roleNames() const;成员函数比较关键,是QML读取C++数据的关键函数。
TreeModel.cpp源文件如下:
TreeModel::TreeModel(QObject *parent) :
QAbstractItemModel(parent), m_rootItem(NULL)
{
m_rootItem = new TreeItem;
QList<QVariant> list;