来自 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。
我正在尝试从 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。