從C++動態實例化一個QML對象是well documented,但我找不到如何使用它的屬性的預先指定的值來實例化它。從C++創建具有指定屬性的QML對象
例如,我創建一個選自C稍微修改SplitView
++這樣的:
QQmlEngine* engine = QtQml::qmlEngine(this);
QQmlComponent splitComp(engine, QUrl("qrc:/qml/Sy_splitView.qml"));
QObject* splitter = splitComp.create();
splitter->setProperty("orientation", QVariant::fromValue(orientation));
我的問題是,指定SplitView
的後orientation
它被實例化導致它的內部佈局,打破。那麼,有沒有辦法用orientation
創建SplitView
?
或者,我可以在單獨的文件中創建水平和垂直版本的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();
但它有令人驚訝的沒有影響。
我敢打賭,事情是在你如何試圖通過QVariant分配枚舉(枚舉在QML中有些錯誤)。我會嘗試首先註冊一個簡單的基於QObject的類型和一個自定義枚舉,並檢查整個事情是否可用。[還要注意,你顯然試圖設置父母兩次,但這是次要] – mlvljr
我不知道關於枚舉,所以謝謝我會嘗試它。我沒有設置父母兩次,我首先設置'QObject'父母,然後設置QML視覺父母(如果我可以通過QML設置'QObject'父母,我完全不會用C++來打擾)。 – cmannett85
的確,而不是設置QObject parent,你可以將內存所有權(或稱爲QmlOwnership)設置爲QmlOwnership,我相信(如果需要,新創建的對象將由QML運行時進行垃圾收集/重新計數)。順便說一下,你是否因爲內存管理以外的某些原因而特別需要設置QObject父級? – mlvljr