Элементы QT QML как в C ++, так и в QML

Моя цель — описать элемент qml в файле qml, а затем использовать соответствующий класс C ++ для добавления к визуальному представлению этого элемента.

Я знаю, что можно описать элемент qml и использовать его в файле qml и общаться с ним из c ++ через сигнал / слоты.

Я также знаю, что можно описать элемент qml в C ++ с использованием QQuickPaintedItem и использовать его в файле qml (делая его доступным через механизм регистрации). Есть ли другие способы?

Итак, актуальный вопрос: можно ли объединить оба в одном предмете?
Итак, я хочу иметь элемент qml а также класс c ++, рисующий ту же область, например У меня есть конкретный код OpenGL на c ++ и обычный прямоугольник с MouseArea, определенный в qml.

1

Решение

После подсказки от Андрея я решил реализовать свою цель — иметь представление qml и класс рендеринга C ++, создав класс-обертку, производный от QQuickPaintedItem, и переопределив метод рисования. С этим я могу сделать в элемент в коде. Элемент используется в моем основном файле qml.

Это класс-оболочка, потому что он загружает файл qml, который я хочу показать, через QQmlComponent, который создает QuickItem, который я тоже хочу показать. Я делаю это, устанавливая родительский элемент загруженного / созданного элемента в мой класс-оболочку.
Итак, в моем классе QuickPaintedItem (лучше всего это делать в начале класса, когда двигатель уже инициализирован):

QQmlComponent component(engine,QUrl("qrc:/myqml.qml"));
QObject* object = component.create();
QQuickItem* quickItem = qobject_cast<QQuickItem*>(object);
quickItem->setParentItem(this);

Затем отображается myqml.qml и мой метод рисования. И у меня есть центральное место, где я могу использовать оба.

После комментариев от Велкана, другой способ — поместить загрузку компонента в погрузчик qml item:

Wrapper { Loader{ onQmlChanged: source = newQml } }

где onQmlChanged будет слот, который потребляет сигнал:

signal onQmlChanged(string newQml);

Я не могу сказать, какой путь лучше производительности. Определение структуры в qml кажется более простым и понятным. Отличие от версии кода заключается в том, что он загружает элемент во время создания Оболочки, то есть во время создания файла main.qml и до его отображения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]