来自 jsonModel 的 QML 中的空 TreeView

empty TreeView in QML from jsonModel

我正在尝试从 c++ jsonModel (this one) 在 QML 中显示 Json TreeView,但它在 QML 中显示为空,其中没有数据。而 运行 c++ 中的示例有效 fine.I 在 c++ 中使用 TreeView 作为 QML 类型和 setContextProperty("qjsonmodel",model) 来建立 c++ 和 QML 之间的连接。

这是 QML 中显示的内容。

TreeView{
        id:tree
        x: 0
        //anchors.fill: parent
        width: 335
        height: 420
        anchors.topMargin: 0
        anchors.bottomMargin: 6
        anchors.rightMargin: 1287
        anchors.bottom: frame.top
        anchors.top: parent.top
        clip: true

        model: qjsonmodel
        TableViewColumn{
            title:"Defects"

        }

    }

您的问题是模型没有角色,解决方案是为其创建这些角色,您必须进行以下更改:

*.h

...

class QJsonModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    explicit QJsonModel(QObject *parent = 0);
    ~QJsonModel();
    enum JsonRoles{
        KeyRole = Qt::UserRole + 1000,
        ValueRole
    };
    ...
    QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
    ...
};

*.cpp

...
QVariant QJsonModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    QJsonTreeItem *item = static_cast<QJsonTreeItem*>(index.internalPointer());

    if (role == Qt::DisplayRole) {

        if (index.column() == 0)
            return QString("%1").arg(item->key());

        if (index.column() == 1)
            return QString("%1").arg(item->value());
    }
    else if (role == KeyRole) {
        return QString("%1").arg(item->key());
    }
    else if(role == ValueRole){
        return QString("%1").arg(item->value());
    }
    return QVariant();

}
...
QHash<int, QByteArray> QJsonModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[KeyRole] = "keyData";
    roles[ValueRole] = "valueData";
    return roles;
}
...

*.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    TreeView{
        anchors.fill: parent

        model: qjsonmodel
        TableViewColumn{
            title:"Key"
            role: "keyData"
        }
        TableViewColumn{
            title:"Role"
            role: "valueData"
        }
    }
}

您可以在下面找到完整的示例link