On Thu, 2010-11-04 at 23:44 +0100, Brasser Michael (Nokia-MS-Qt/Brisbane) wrote: > Hi, > > On 04/11/2010, at 10:26 PM, ext René Hansen wrote: > > > I'd like to be able to find child objects in a QML structure and to do > > that, I've exposed a new QML Object with qmlRegisterType, which provides > > me with: > > > > QObject *QmlUnitTestHelper::getChildById(QObject *parent, QString name) { > > return parent->findChild<QObject *>(name); > > } > > > > And in Qml I have something like this: > > > > Rectangle { > > > > QmlUnitTestHelper { > > id: quth > > } > > > > Rectangle { > > id:outerRect > > Rectangle { > > id:innerRect > > Text { > > id:label > > text: "Hello World" > > } > > } > > } > > } > > > > Which should enable me to test in something like this manner: > > > > quth.getChildById(outerRect, "innerRect").label.text == "Hello World" > > > > However, this doesn't work as expected, so I guess my assuming the QML > > id property being the same as a QObjects objectName is faulty. > > That's correct -- id and objectName are separate. You can explicitly give a > QML item an objectName, though, if needed: > > Rectangle { > id: myRect > objectName: "theRectangle" > } > > (Bea has just added some great documentation on this, which should hopefully > be showing up on the website soon) > > > How would I go about doing something like this? > > For the above example, you should be able to test the label's text with: > label.text == "Hello World" > (within a component, the id space is "flat", rather than qualified) > > If you need to access the item from outside the component, a property alias > (http://doc.qt.nokia.com/4.7/qml-extending-types.html#property-aliases) might > help. You could for example add > > property alias testLabel: label > > to the top-most Rectangle to make label accessible to the "outside world" via > testLabel.
This is what I'd like to avoid though. It would be preferable not to have to clutter up the codebase, just to be able to test it. > > From the class name, it looks like you might be looking at writing autotests > in QML? If so (and If you haven't seen them already), here are a few projects > that might be of interest: > * qmlunit (https://github.com/fgrehm/qmlunit) > * the Qt3D team's QML unit testing > (http://qt.gitorious.org/qt-labs/qt3d/trees/master/tests/auto/qml3d) It is for autotesting yes and I have based it on qmlunit. With qmlunit there is some shortcomings though, so I've had to remodel it a bit. Basically with qmlunit, you load the QML object that you want to test in another qml object, a QmlTestCase, and interact with it from there. So let's say I want to test the object that is my whole application. E.g. Main { id: main }, I've left out child elements, but imagine I have a lot of stuff, buttons etc. several states even. Then I would like to test application logic by sending keypresses and mouseclicks on certain child elements of my application, buttons, inputs etc. However, since I've instantiated my application in another qml file, the internal id's of main are not accessible, so how do I send a click event to a button for instance? That was why I wanted to have a getChildById method, so I could actually find the element I wanted and send it whatever event. The way I've done it now is to enforce setting objectName on all elements that I need to access to and then instead of having getChildById, it's getChildByObjectName, which is just QObject::findChild() wrapped. My point is that identical id and objectName makes for redundant code, so if there was a way of addressing by id, as done in QML, it would definitely help quell my OCD and make for a more DRY feel of the QML code. /René _______________________________________________ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml