Совет по импорту списка с экземплярами класса из c ++ в qml во время выполнения - PullRequest
0 голосов
/ 09 июля 2020

У меня есть QList, где каждый элемент является экземпляром класса C ++. Эти экземпляры содержат информацию, и на основе этого я хочу создавать и перемещать прямоугольники в QML. Содержащаяся информация - это позиция x (среди прочего), и я хочу создать / переместить один прямоугольник для каждого элемента в QList. QList обновляется через периоды c интервалы во время выполнения, что означает, что некоторые элементы могут быть добавлены, удалены или отредактирована позиция x.

Я запрограммировал небольшой пример, чтобы понять, как sh установить мост между c ++ и QML, но я думаю, что мой код будет работать только один раз в качестве инициализации, а не если я обновлю QList во время выполнения. На правильном ли я пути, и если нет, что мне нужно изменить? Нужно ли использовать QAbstractListModel, как это предлагается в ответах на этот вопрос Timmmm?

Вот мой код: class.h:

#ifndef CLASS_H
#define CLASS_H

#include <QQuickItem>

class RectangelClass : public QObject
{
private:
    Q_OBJECT
    Q_PROPERTY(int xPos READ xPos WRITE setXPos NOTIFY xPosChanged)
    int m_xPos;

public:
    RectangelClass () {}
    int xPos() const { return m_xPos; }

public slots:
    void setXPos(int arg)
    {
        if (m_xPos == arg)
            return;

        m_xPos = arg;
        emit xPosChanged(arg);
    }

signals:
    void xPosChanged(int arg);
};

class RectangelClassManager : public QObject
{
private:
    Q_OBJECT
    Q_PROPERTY(QList <QObject*> rectangelClassList READ rectangelClassList WRITE setRectangelClassList NOTIFY rectangelClassListChanged)
    QList <QObject*> m_rectangelClassList;

public:
    RectangelClassManager ()
    {
        QList <QObject*> localObjList;
        for (int i = 0; i < 5; i++)
        {
            RectangelClass *localObj = new RectangelClass();
            localObj->setXPos (i*100);
            localObjList.push_back(localObj);
        }

        setRectangelClassList (localObjList);

    }

    QList <QObject*> rectangelClassList () const { return m_rectangelClassList; }

public slots:
    void setRectangelClassList (QList <QObject*> arg)
    {
        if (m_rectangelClassList == arg)
            return;

        m_rectangelClassList = arg;
        emit rectangelClassListChanged(arg);
    }

signals:
    void rectangelClassListChanged (QList <QObject*> arg);
};

#endif // CLASS_H

main. cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "class.h"
#include <iostream>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<RectangelClass>("cppclasses", 1, 0, "RectangelClass");
    qmlRegisterType<RectangelClassManager>("cppclasses", 1, 0, "RectangelClassManager");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

main.qml:

import QtQuick 2.4
import QtQuick.Window 2.2
import cppclasses 1.0


Window {

    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    RectangelClassManager{
        id: rectangelClassManager
    }

    Rectangle{
        id: rect0
        x: rectangelClassManager.rectangelClassList[0].xPos
        y: 100
        width: 80
        height: 80
        color:"yellow"
        Text {
            id: textid0
            anchors.centerIn: parent
            text: "X-Position: " + rectangelClassManager.rectangelClassList[0].xPos
        }
    }

    Rectangle{
        id: rect1
        x: rectangelClassManager.rectangelClassList[1].xPos
        y: 100
        width: 80
        height: 80
        color:"yellow"
        Text {
            id: textid1
            anchors.centerIn: parent
            text: "X-Position: " + rectangelClassManager.rectangelClassList[1].xPos
        }
    }

    Rectangle{
        id: rect2
        x: rectangelClassManager.rectangelClassList[2].xPos
        y: 100
        width: 80
        height: 80
        color:"yellow"
        Text {
            id: textid2
            anchors.centerIn: parent
            text: "X-Position: " + rectangelClassManager.rectangelClassList[2].xPos
        }
    }

    Rectangle{
        id: rect3
        x: rectangelClassManager.rectangelClassList[3].xPos
        y: 100
        width: 80
        height: 80
        color:"yellow"
        Text {
            id: textid3
            anchors.centerIn: parent
            text: "X-Position: " + rectangelClassManager.rectangelClassList[3].xPos
        }
    }

    Rectangle{
        id: rect4
        x: rectangelClassManager.rectangelClassList[4].xPos
        y: 100
        width: 80
        height: 80
        color:"yellow"
        Text {
            id: textid4
            anchors.centerIn: parent
            text: "X-Position: " + rectangelClassManager.rectangelClassList[4].xPos
        }
    }
}

Отредактируйте, чтобы сделать мой вопрос более ясным: Можно ли обновить QList во время выполнения в c ++, будет ли он обновляться в QML, а если нет, то как мне этого добиться?

1 Ответ

1 голос
/ 10 июля 2020

Да, свойство QList можно обновить во время выполнения, исполнив сигнал rectangelClassListChanged(). Однако это может оказаться очень неэффективным, поскольку весь список подвергается повторной обработке. Итак, в зависимости от того, как часто изменяется ваш QList, вам может быть лучше изменить его на QAbstractListModel.

Кроме того, вы можете изменить свой код, чтобы использовать Repeater, это повредит моему программисту - глаза ;-) и это может быть причиной того, что время выполнения не обновляется.

import QtQuick 2.4
import QtQuick.Window 2.2
import cppclasses 1.0


Window {

    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    RectangelClassManager{
        id: rectangelClassManager
    }

    Repeater {
        model: rectangelClassManager.rectangelClassList

        delegate: Rectangle {
            x: modelData.xPos
            y: 100
            width: 80
            height: 80
            color:"yellow"
            Text {
                id: textid0
                anchors.centerIn: parent
                text: "X-Position: " + modelData.xPos
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...