У меня есть 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, а если нет, то как мне этого добиться?