Проблема в вашем случае состоит в том, что модель не имеет ролей, решение состоит в том, чтобы создать эти роли для нее, вы должны внести следующие изменения:
*. 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"
}
}
}
Полный пример вы можете найти по следующей ссылке .