Я показываю весь свой код для проверки концепции. , который включает больше минимума, чтобы вы могли понять, что мне действительно нужны элементы, а не их содержимое.
Приведенный ниже код содержит два небольших типа объектов с общим QQuickItem родительский класс, список которого содержит множество элементов (которые могут изменяться во время выполнения, добавляя, удаляя и изменяя свойства), повторитель qml для отображения элементов в списке и основной элемент для связывания элементов вместе.
Линия
Код: Выделить всё
property list myModel: Backend.model
Код: Выделить всё
QQmlApplicationEngine failed to load component
qrc:/mainProof.qml:17:34: Syntax error
Код: Выделить всё
#ifndef BACKEND_H
#define BACKEND_H
#include
#include
#include
class TextItem : public QQuickText
{
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(QString itemType MEMBER m_itemType NOTIFY itemTypeChanged)
public:
TextItem() : QQuickText(Q_NULLPTR), m_itemType("TextItem") {
setText("TextItem"); setPosition(QPointF(10, 15)); setSize(QSizeF(100, 20)); }
signals:
void itemTypeChanged();
private:
QString m_itemType;
};
class RectangleItem : public QQuickRectangle
{
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(QString itemType MEMBER m_itemType NOTIFY itemTypeChanged)
public:
RectangleItem() : QQuickRectangle(Q_NULLPTR), m_itemType("RectangleItem") {
setPosition(QPointF(40, 120)); setSize(QSizeF(100, 50)); setColor(Qt::red); }
signals:
void itemTypeChanged();
private:
QString m_itemType;
};
class Backend : public QObject
{
Q_OBJECT
Q_PROPERTY(QList model MEMBER m_model NOTIFY modelChanged)
QML_ELEMENT
QML_SINGLETON
public:
explicit Backend(QObject *parent = nullptr) : QObject{parent} {
m_model.append(new TextItem());
m_model.append(new RectangleItem());
RectangleItem *r = new RectangleItem(); r->setColor(Qt::green); r->setPosition(QPointF(180, 120)); m_model.append(r);
TextItem *t = new TextItem(); t->setPosition(QPointF(40, 200)); t->setText("SecondTextItem"); m_model.append(t);
}
virtual ~Backend() override {
for (QQuickItem *item : m_model) delete item;
}
signals:
void modelChanged();
private:
QList m_model;
};
#endif // BACKEND_H
Код: Выделить всё
#include "backend.h"
#include
#include
#include
#define APP_URI "uri.dlitems"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterSingletonType(APP_URI, 1, 0, "Backend", [](QQmlEngine *, QJSEngine *) {
return new Backend();
});
qmlRegisterType(APP_URI, 1, 0, "MyTextItem");
qmlRegisterType(APP_URI, 1, 0, "MyRectangleItem");
const QUrl url(QStringLiteral("qrc:/mainProof.qml"));
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreated,
&app,
[url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
},
Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
Код: Выделить всё
import QtQuick 2.12
import QtQuick.Window 2.1
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.0
import Qt.labs.qmlmodels 1.0
import uri.dlitems 1.0
ApplicationWindow {
id: proofRoot
visible: true
width: 1024
height: 545
property list myModel: Backend.model // Here I get error
Rectangle {
id: trouble
anchors {
top: parent.top
left: parent.left
right: parent.right
bottom: parent.bottom
margins: 20
}
Repeater {
anchors.fill: parent
anchors.margins: 20
model: proofRoot.myModel
delegate: DelegateChooser {
id: chooser
role: "itemType"
DelegateChoice { roleValue: "TextItem"; MyTextItem {
x: model.x
y: model.y
height: model.height
width: model.width
color: model.color
text: model.text
}
}
DelegateChoice { roleValue: "RectangleItem"; MyRectangleItem {
x: model.x
y: model.y
height: model.height
width: model.width
color: model.color
}
}
}
}
}
}
Код: Выделить всё
property list myModel: Backend.model // Qt 6 works, Qt 5 same syntax error
property list myModel: Backend.model // even Qt 6 fails to get the delegates (with the errors shown below); Qt 5 still syntax error
property var myModel: Backend.model // Qt 5 accepts the list, but both Qt 5 and Qt 6 fail to get the delegates:
qrc:/mainProof.qml:45:25: Unable to assign [undefined] to QString
qrc:/mainProof.qml:44:25: Unable to assign [undefined] to QColor
qrc:/mainProof.qml:41:25: Unable to assign [undefined] to double
...
Код: Выделить всё
Q_PROPERTY(QQmlListProperty model READ model NOTIFY modelChanged)
Кажется, ничего из того, что я пытаюсь сделать, не помогает Qt 5.15 работать.
Любая платформа; Должно работать в Qt 5.15 (работает в Qt 6.8, возможно, в любой версии выше 6.4)
Подробнее здесь: https://stackoverflow.com/questions/793 ... -6-4-works
Мобильная версия