Qt中自定义只读TreeView的Model

通过学习Qt自带的例子和帮助文档,简化了其中的一个例子,来学习如何自定义TreeView的Model。
以下是自定义一个只读的TreeView的Model,实际中可以直接复制过来使用,避免重复造轮子。
官方的文档一直都是很好的学习资料,尤其是官方的例子和help文档。本文参考了官方的Simple Tree Model Example例子。
在这里插入图片描述
这是简单的树状结构,可以看出行的结构,但是缺乏列的信息。
在这里插入图片描述
在这里插入图片描述
这样我们就清楚treeitem中的成员变量:QList m_itemData;中存储的链表的情况了。

treeitem.h文件:

#ifndef TREEITEM_H
#define TREEITEM_H

#include <QList>
#include <QVariant>

class TreeItem
{
   
   
public:
    explicit TreeItem(const QList<QVariant> &data, TreeItem *parentItem = nullptr);
    ~TreeItem();

    void appendChild(TreeItem *child);

    TreeItem *child(int row);
    int childCount() const;
    int columnCount() const;
    QVariant data(int column) const;
    int row() const;
    TreeItem *parentItem();

private:
    QList<TreeItem*> m_childItems;
    QList<QVariant> m_itemData;
    TreeItem *m_parentItem;
};

#endif // TREEITEM_H

treeitem.cpp文件:

#include <QStringList>
#include "treeitem.h"

TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
{
   
   
    m_parentItem = parent;
    m_itemData = data;
}

TreeItem::~TreeItem()
{
   
   
    qDeleteAll(m_childItems);
}

void TreeItem::appendChild(TreeItem *item)
{
   
   
    m_childItems.append(item);
}

TreeItem *TreeItem::child(int row)
{
   
   
    return m_childItems.value(row);
}

int TreeItem::childCount() const
{
   
   
    return m_childItems.count();
}

int TreeItem::columnCount() const
{
   
   
    return m_itemData.count();
}

QVariant TreeItem::data(int column) const
{
   
   
    return m_itemData.value(column);
}

TreeItem *TreeItem::parentItem()
{
   
   
    return m_parentItem;
}

int TreeItem::row() const
{
   
   
    if (m_parentItem)
        return m_parent
QtTreeView组件通常用于显示数据模型的数据,如列表或树形结构。如果你想要自定义一个Model来展示JSON数据,首先需要做的是创建一个QAbstractItemModel的子类,并处理解析和存储JSON内容。以下是基本步骤: 1. 创建一个模型类:继承自`QStandardItemModel`或更具体的`QTreeModel`,例如`MyJsonModel`。 ```cpp class MyJsonModel : public QTreeModel { public: explicit MyJsonModel(QObject *parent = nullptr); ~MyJsonModel(); // 重写必要的方法,如headerData()、rowCount()、columnCount()以及setData() // 这里假设你有一个parseJson函数来解析JSON并填充数据到节点 void parseJson(const QByteArray &json); private: QHash<int, QByteArray> roleNames; }; ``` 2. 初始化模型和解析JSON数据: ```cpp MyJsonModel *model = new MyJsonModel(this); model->parseJson(jsonBytes); // jsonBytes是一个包含JSON字符串的QByteArray // 将模型设置给TreeView QTreeView *treeview = new QTreeView(); treeview->setModel(model); ``` 3. 解析JSON和添加数据到模型: ```cpp void MyJsonModel::parseJson(const QByteArray &json) { QJsonDocument doc(QJsonDocument::fromJson(json)); QJsonObject root = doc.object(); foreach (const QJsonValue &item, root.values()) { QJsonObject itemObj = item.toObject(); // 添加节点到树视图模型 QStandardItem *node = new QStandardItem(itemObj["name"].toString()); int parentId = ...; // 根据数据结构确定父节点ID if (!addRow(parentId, node)) { qDebug() << "Failed to add row"; } } } ``` 4. `addRow()`方法可以根据实际需求来编写,它会将每个JSON对象转换为QStandardItems并添加到适当的层级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值