使用指定的属性从C++创建QML对象

cma*_*t85 6 c++ qt qml qt-quick

从C++动态实例化QML对象已有详细记录,但我找不到的是如何使用为其属性预先指定的值来实例化它.

例如,我正在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 ) );
Run Code Online (Sandbox Code Playgroud)

我的问题是,指定orientationSplitView 它被实例化会导致它的内部布局打破.那么,有没有创造的方式SplitVieworientation已经规定?

或者,我可以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();
Run Code Online (Sandbox Code Playgroud)

但它没有令人惊讶的效果.

小智 0

我认为您应该能够使用自定义方法QQmlIncubatorQQmlComponent::create(QQmlIncubator & incubator, QQmlContext * context = 0, QQmlContext * forContext = 0)工厂方法。

特别是,引用文档QQmlIncubator

void QQmlIncubator::setInitialState(QObject * object) [虚拟保护]

在首次创建对象之后、评估属性绑定之前调用,并且在适用的情况下调用 QQmlParserStatus::componentComplete()。这相当于 QQmlComponent::beginCreate() 和 QQmlComponent::endCreate() 之间的点,可用于为对象的属性分配初始值。

默认实现不执行任何操作。