Dynamisch instanziieren ein QML-Objekt aus C++ ist well documented, aber was ich nicht finden kann ist, wie es mit vordefinierten Werte für seine Eigenschaften instanziieren.Erstellen Sie QML-Objekt aus C++ mit angegebenen Eigenschaften
Zum Beispiel ich schaffe eine etwas SplitView
von C++ wie folgt geändert:
QQmlEngine* engine = QtQml::qmlEngine(this);
QQmlComponent splitComp(engine, QUrl("qrc:/qml/Sy_splitView.qml"));
QObject* splitter = splitComp.create();
splitter->setProperty("orientation", QVariant::fromValue(orientation));
Das Problem, das ich habe ist, dass die orientation
des SplitView
nach Angabe es instanziiert wird bewirkt, dass es interne Layout zu brechen . Also, gibt es eine Möglichkeit, die SplitView
mit der orientation
bereits festgelegt zu erstellen?
Alternativ kann ich sowohl eine horizontale als auch eine vertikale Version von SplitView
in separaten Dateien erstellen und die entsprechende zur Laufzeit instanziieren - aber das ist weniger elegant.
aktualisieren
I QQmlComponent::beginCreate(QQmlContext* publicContext)
gefunden:
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();
Aber es hatte überraschend keine Wirkung.
Ich wette, die Sache ist in wie Sie versuchen, die Enum über QVariant zuweisen (Enums sind etwas fehlerhaft in QML). Ich würde versuchen, zuerst einen einfachen QObject-basierten Typ und eine benutzerdefinierte Enumeration zu registrieren und zu überprüfen, ob das Ganze überhaupt funktioniert.[Bitte beachten Sie, dass Sie anscheinend versuchen, Eltern zweimal zu setzen, aber das ist geringfügig] – mlvljr
Ich wusste das nicht über Enums, also danke, ich werde es versuchen. Und ich setze den Elternteil nicht zweimal, setze zuerst das Elternobjekt 'QObject' und dann QML visuelle Elternsekunde (wenn ich das' QObject' Elternteil über QML setzen könnte, hätte ich mich überhaupt nicht mit C++ beschäftigt). – cmannett85
Richtig, in der Tat; Anstatt den QObject-Parent zu setzen, könnte man Speicherbesitz (oder wie auch immer er aufgerufen wird) auf QmlOwnership setzen, so glaube ich (so dass das neu erstellte Objekt bei Bedarf von der QML-Laufzeit abgeführt/ref-gezählt wird). Übrigens, müssen Sie das QObject-Parent speziell aus anderen Gründen als der Speicherverwaltung setzen? – mlvljr