我正在尝试从c ++ jsonModel(this one)在QML中显示Json TreeView,但它在QML中显示为空,其中没有数据。在c ++中运行示例时它运行正常。我在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"
}
}
答案 0 :(得分:0)
您的问题是模型没有角色,解决方案是为其创建角色,您必须进行以下更改:
<强> *的.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中找到完整的示例。