Создание модели в виде дерева из QAbstractItemModel или QAbstractListModel - PullRequest
0 голосов
/ 09 января 2020

В соответствии с приведенным ниже кодом, мне нужно создать модель, которая будет иметь N номер "Система" , а каждая "Система" будет иметь 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. Но я ищу модель, похожую на одну модель списка, и каждый элемент списка будет содержать древовидную структуру, как указано выше в классах. Попросить любого предложить, как создать модель, которая будет иметь древовидную структуру. и какой QAbstractxxxxxmodel будет правильным для реализации этой концепции. а на стороне QML я хочу получить доступ к данным через индекс до coresData, так же, как и выше код QML.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 января 2020

Проверьте этот похожий вопрос для некоторых идей.

Если вы не непреклонны в использовании 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()

                        }
                    }
                }
            }
        }
    }
}
...