0

根据下面的代码,我需要创建一个模型,该模型将具有 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})
                }

考虑模型是在 cpp 端开发的,参考上面的 cpp 类 Sytem、SytemDatabase 和 CoresData ,并且在 qml 代码中传递和使用相同的模型,如下所示

Repeater {
                id: repeaterRootSystem
                model: SytemTree
                delegate: customRectangle {---
                    visible: systemAvailable
                    value: systemNumber
                    ----
                    Repeater {
                        id: repeaterDatabase
                        model: SytemTree.get(index).SytemDatabase
                        delegate: customRectangle {---
                            visible: databaseVisible
                            value: databaseNumber
                            ---
                            Repeater {
                                id: repeaterCoresData
                                model: SytemTree.get(index).SytemDatabase.get(index).CoresData
                                delegate: customRectangle {--
                                    visible: coreAvailable
                                    value: coreNumber
                                    speed: coreSpeed
                                    ----
                                }
                            }
                        }
                    }
                }
            }   

我已经了解了 QAbstractListModel、QAbstractItemModel 和 QAbstractTableModel 的概念。但是我正在寻找一个像一个列表模型这样的模型,每个列表元素都将包含一个树状结构,如上面在类中提到的那样。要求任何人建议如何创建一个具有树状结构的模型。以及哪个 QAbstractxxxxxx 模型将是正确的来实现这个概念。在 QML 方面,我想通过索引直到 coresData 访问数据,就像上面的 QML 代码一样。

提前致谢。

4

1 回答 1

0

查看这个类似的问题以获得一些想法。

如果您不坚持使用 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()

                        }
                    }
                }
            }
        }
    }
}
于 2020-01-10T19:44:19.060 回答