从QAbstractItemModel或QAbstractListModel创建树类型的模型

问题描述 投票:0回答:1

按照下面的代码,我需要创建一个模型,该模型将具有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代码一样。

提前感谢。

qt qml qt5 qabstractitemmodel qabstractlistmodel
1个回答
0
投票

查看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()

                        }
                    }
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.