Say you would like to manipulate an Item you have declared in a QML-file through C++/Qt logic. This example is again based on the Qt Quick 2 Application template provided by Qt Creator 2.61, and run on Qt 5.0. We add a new Item (these are called QQuickItems in logic) to the main.qml file with the id "manipulatedItem", so that it looks something like this:
import QtQuick 2.0 Rectangle { width: 360 height: 360 Text { text: qsTr("Hello World") anchors.centerIn: parent } MouseArea { anchors.fill: parent onClicked: { Qt.quit(); } } Rectangle { id: notObjectName objectName: "manipulateMe" color: "blue" anchors.fill: parent } }
Notice that we define the property "objectName" for this new Item. Now we can modify the added QML-item in main.cpp:
#include <QtGui/QGuiApplication> #include "qtquick2applicationviewer.h" #include <QQuickItem> // Notice this include int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QtQuick2ApplicationViewer viewer; viewer.setMainQmlFile(QStringLiteral("qml/untitled1/main.qml")); // The findChild-method is used to locate the child object called "manipulateMe". // This searching is done recursively, so the whole "branch" is searched. Notice // that this searched name is NOT the id of the QML-item, but it is the property // called "objectName". QQuickItem * manipulatedQQuickItem = viewer.rootObject()-> findChild<QQuickItem*>("manipulateMe"); // Now we can manipulate the object through this pointer. // But what if the pointer becomes invalid? if (manipulatedQQuickItem) { manipulatedQQuickItem->setOpacity(0.5); manipulatedQQuickItem->setProperty("color","red"); } viewer.showExpanded(); return app.exec(); }
Now you can now modify the Item anyway you like. But there is a risk that the Item gets destroyed before you modify it. So as always you have to be careful with dangling pointers.
Ei kommentteja:
Lähetä kommentti