Моя цель — описать элемент qml в файле qml, а затем использовать соответствующий класс C ++ для добавления к визуальному представлению этого элемента.
Я знаю, что можно описать элемент qml и использовать его в файле qml и общаться с ним из c ++ через сигнал / слоты.
Я также знаю, что можно описать элемент qml в C ++ с использованием QQuickPaintedItem и использовать его в файле qml (делая его доступным через механизм регистрации). Есть ли другие способы?
Итак, актуальный вопрос: можно ли объединить оба в одном предмете?
Итак, я хочу иметь элемент qml а также класс c ++, рисующий ту же область, например У меня есть конкретный код OpenGL на c ++ и обычный прямоугольник с MouseArea, определенный в qml.
После подсказки от Андрея я решил реализовать свою цель — иметь представление 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 и до его отображения.
Других решений пока нет …