Динамическое создание объекта QML из C++ — это хорошо задокументировано, но я не могу найти, как создать экземпляр с предварительно заданными значениями для его свойств.
Например, я создаю слегка модифицированный SplitView
из C++ следующим образом:
QQmlEngine* engine = QtQml::qmlEngine( this );
QQmlComponent splitComp( engine, QUrl( "qrc:/qml/Sy_splitView.qml" ) );
QObject* splitter = splitComp.create();
splitter->setProperty( "orientation", QVariant::fromValue( orientation ) );
Проблема, с которой я столкнулся, заключается в том, что указание orientation
для SplitView
после его создания приводит к нарушению его внутреннего макета. Итак, есть ли способ создать SplitView
с уже указанным orientation
?
В качестве альтернативы я могу создать как горизонтальную, так и вертикальную версию SplitView
в отдельных файлах и создать соответствующий экземпляр во время выполнения, но это менее элегантно.
Обновить
Я нашел QQmlComponent::beginCreate(QQmlContext* publicContext)
:
QQmlEngine* engine = QtQml::qmlEngine( this );
QQmlComponent splitComp( engine, QUrl( "qrc:/qml/Sy_splitView.qml" ) );
QObject* splitter = splitComp.beginCreate( engine->contextForObject( this ) );
splitter->setProperty( "orientation", QVariant::fromValue( orientation ) );
splitter->setParent( parent() );
splitter->setProperty( "parent", QVariant::fromValue( parent() ) );
splitComp.completeCreate();
Но на удивление не подействовало.
QObject
, а затем визуальный родитель QML (если бы я мог установить родителяQObject
через QML, я бы вообще не стал возиться с C++ для этого). - person cmannett85   schedule 31.10.2013SplitView
содержит два настраиваемых окна просмотра OSG, каждое из которых, в свою очередь, может быть разделено до бесконечности (как панели текстового редактора Qt Creator), образуя дерево. Поэтому, когда я удаляю определенный сплиттер, он соответствующим образом удаляет все дочерние элементы. Я посмотрю на право собственности на стороне QML, это может упростить ситуацию - спасибо! - person cmannett85   schedule 31.10.2013