按照下面的代码,我需要创建一个模型,该模型将具有N个“ System”,每个“ System”将具有N个“ SytemDatabase”和每个“ SytemDatabase”将具有N个“ CoresData”。在应用程序启动期间会知道此N号。
struct CoresData {
int m_iCoreSpeed;
bool m_bCoreAvailable;
};
class SytemDatabase {
public:
SytemDatabase();
bool m_bDatabaseVisible;
int m_iDatabaseNumber;
QList<CoresData> m_listCoresData;
};
class Sytem {
public:
Sytem();
bool m_bSystemAvailable;
int m_iSystemNumber;
QList<SytemDatabase> m_listSytemDatabase;
};
class SytemTree : public QAbstractItemModel {
Q_OBJECT
public:
explicit SytemTree( QObject *parent = nullptr);
~SytemTree();
QVariant data(const QModelIndex &index, int role) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &index) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
private:
void addSytemDatabase(Sytem &data);
QList<Sytem> m_listSystem;
};
目前,我已经使用ListModel设计了该模型,并且可以正常工作。现在由于某种原因,我需要将此模型移至cpp并将该模型传递给qml。以下是供参考的QML代码
SytemTree.append({ "iSystemNumber": systemNumber, "bSystemAvailable": false, "SytemDatabase":[{ "iDatabaseNumber": databaseNumber, "bDatabaseVisible": false,"CoresData": []}]})
for( var lp = 0; lp < totalcoreData; ++lp) {
SytemTree.get(systemNumber).SytemDatabase.get(iDatabaseNumber).CoresData.append({ "bCoreAvailable": true, "bCoreAvailable": true, "iCoreNumber": coreNumber})
}
在qml方面,我想像下面这样传递此模型
Repeater {
id: repeaterSystem
model: SytemTree
delegate: Rectangle {--
----
}
Repeater {
id: repeaterDatabase
model: SytemTree.get(index).SytemDatabase
delegate: Rectangle {---
---
}
Repeater {
id: repeaterCoresData
model: SytemTree.get(index).SytemDatabase.get(index).CoresData
delegate: Rectangle {--
----
}
我已经了解了QAbstractListModel,QAbstractItemModel和QAbstractTableModel的概念。但是我正在寻找一种类似于一个列表模型的模型,并且每个列表元素都将包含一个树状结构,如上面的类中所述。要求任何人建议如何创建具有树状结构的模型。以及哪个QAbstractxxxxxmodel将是正确的实现此概念的模型。在QML方面,我想通过索引直到coresData来访问数据,就像上面的QML代码一样。
提前感谢。
查看this similar question了解一些想法。
如果您不坚持使用QAbstractItemModel,这是我以前使用过的基于qml的解决方案:
import QtQuick 2.9
import QtQuick.Window 2.2
import UISettings 1.0
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import QtQuick.Controls 1.4 as SV
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Flickable {
id: flick
anchors.fill: parent
clip: true
contentHeight: col.implicitHeight
property var mymodel: {
"animals": {
"big": {
"land": "elephants",
"water": "whales"
},
"small": {
"land": "mice",
"water": "fish"
}
},
"plants": {
"trees": "evergreens"
}
}
Column {
id: col
Component.onCompleted: componentListView.createObject(this, {"objmodel":flick.mymodel});
}
Component {
id: componentListView
Repeater {
id: repeater
property var objmodel: ({})
model: Object.keys(objmodel)
ColumnLayout {
Layout.leftMargin: 50
Button {
property var sprite: null
text: modelData
onClicked: {
if(sprite === null) {
if(typeof objmodel[modelData] === 'object')
sprite = componentListView.createObject(parent, {"objmodel":objmodel[modelData]});
}
else
sprite.destroy()
}
}
}
}
}
}
}