Синтаксическая ошибка Qt 5.15 QML в list (хотя Qt > 6.4 работает)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Синтаксическая ошибка Qt 5.15 QML в list (хотя Qt > 6.4 работает)

Сообщение Anonymous »

Мне нужно создать «холст» QML с элементами разных типов. Мне удалось заставить его работать на Qt 6.8, но мой код должен работать и на Qt 5.15.
Я показываю весь свой код для проверки концепции. , который включает больше минимума, чтобы вы могли понять, что мне действительно нужны элементы, а не их содержимое.
Приведенный ниже код содержит два небольших типа объектов с общим QQuickItem родительский класс, список которого содержит множество элементов (которые могут изменяться во время выполнения, добавляя, удаляя и изменяя свойства), повторитель qml для отображения элементов в списке и основной элемент для связывания элементов вместе.
Линия

Код: Выделить всё

property list myModel: Backend.model
выдает ошибку:

Код: Выделить всё

QQmlApplicationEngine failed to load component
qrc:/mainProof.qml:17:34: Syntax error
backend.h:

Код: Выделить всё

#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
main.cpp:

Код: Выделить всё

#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();
}
mainProof.qml:

Код: Выделить всё

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)
на стороне C++ (со всеми вытекающими отсюда дополнительными функциями); такое же поведение, как и с QList
Кажется, ничего из того, что я пытаюсь сделать, не помогает Qt 5.15 работать.
Любая платформа; Должно работать в Qt 5.15 (работает в Qt 6.8, возможно, в любой версии выше 6.4)

Подробнее здесь: https://stackoverflow.com/questions/793 ... -6-4-works
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»