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)
我的问题是,指定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();
Run Code Online (Sandbox Code Playgroud)
但它没有令人惊讶的效果.
小智 0
我认为您应该能够使用自定义方法QQmlIncubator和QQmlComponent::create(QQmlIncubator & incubator, QQmlContext * context = 0, QQmlContext * forContext = 0)工厂方法。
特别是,引用文档QQmlIncubator:
void QQmlIncubator::setInitialState(QObject * object) [虚拟保护]
在首次创建对象之后、评估属性绑定之前调用,并且在适用的情况下调用 QQmlParserStatus::componentComplete()。这相当于 QQmlComponent::beginCreate() 和 QQmlComponent::endCreate() 之间的点,可用于为对象的属性分配初始值。
默认实现不执行任何操作。
| 归档时间: |
|
| 查看次数: |
4981 次 |
| 最近记录: |