2016-08-11 3 views
3

В QML я могу динамически создавать компонент (а не загружать его из файла), вызывая Qt.createQmlObject. Пример:Эквивалент Qt.createQmlObject в C++

Qt.createQmlObject('import QtQuick 1.0; Rectangle {color: "red"; width: 20; height: 20}', parent, "dynamicPath"); 

Есть ли способ сделать то же самое с кода на C++? Не обязательно включать парсинг QML — Я просто ищу способ, например, динамически создавать и прикреплять Rectangle или TextField к документу QML из C++.

ответ

3

Вы используете устаревший Qt Quick 1? Учитывая, что у вас есть:

QDeclarativeView *view = ...; 
QDeclarativeItem *parent = ...; 

Вы можете сделать:

QDeclarativeEngine *engine = view->engine(); 
QDeclarativeComponent component(engine); 
component.setData("import QtQuick 1.0; Rectangle {color: \"red\"; width: 20; height: 20}", QUrl("dynamicPath")); 
QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(component.create()); 
Q_ASSERT(item); 
item->setParentItem(parent); 

Если вы на самом деле с помощью Qt Quick 2 вместо, you'd replaceQDeclarative* с QQml* и QQuick*.

+0

Отлично, спасибо! И нет, я не на Qt Quick 1 - я скопировал образец фрагмента из некоторых явно устаревших документов. – spinda

+0

Является ли 'QUrl (" dynamicPath ")' документированным где-то? Или это просто какое-то имя, которое вы дали? –

+0

Из [docs] (http://doc.qt.io/qt-5/qqmlcomponent.html#setData): «Если предоставлен _url_, он используется для установки имени компонента и предоставления базового пути для элементов разрешенных этим компонентом ». - обычно люди пропускают пустой URL. Если вы получаете сообщение об ошибке, передавая ему что-то не пустое, просто разъясняется, откуда исходит ошибка. – jpnurmi