После подсказки Андрея я решил реализовать свою цель - иметь как представление qml, так и класс рендеринга C ++, создав класс-оболочку, производный от QQuickPaintedItem, и тем самым переопределив метод рисования. С его помощью я могу визуализировать элемент в коде. Этот элемент используется в моем основном файле qml.
Это класс-оболочка, потому что он загружает файл qml, который я хочу показать, через QQmlComponent, который создает QuickItem, который я тоже хочу показать. Я делаю это, устанавливая родительский элемент загруженного / созданного элемента в свой класс-оболочку. Итак, в моем классе QuickPaintedItem (лучше всего в classbegin, когда движок уже инициализирован):
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 кажется проще и чище. Отличие от версии кода заключается в том, что он загружает элемент во время создания Wrapper, то есть во время создания main.qml и до его отображения.
person
PsiX
schedule
13.07.2016
MyPaintedItem { Rectangle{} }
и сохраните вMyPaintedItemWithRectangle.qml
. Затем используйте типMyPaintedItemWithRectangle
. - person Velkan   schedule 13.07.2016