пустой TreeView в QML от jsonModel - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь отобразить Json TreeView в QML из c ++ jsonModel ( этот ), но он отображается пустым в QML без данных в нем. во время выполнения примера на c ++ он работает нормально. Я использовал TreeView в качестве типа QML и setContextProperty ("qjsonmodel", модель) в c ++ для установления связи между 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"

        }

    }

1 Ответ

0 голосов
/ 24 апреля 2018

Проблема в вашем случае состоит в том, что модель не имеет ролей, решение состоит в том, чтобы создать эти роли для нее, вы должны внести следующие изменения:

*. 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"
        }
    }
}

Полный пример вы можете найти по следующей ссылке .

...