Integrating QML Code with Existing Qt UI CodeThere are a number of ways to integrate QML into QWidget-based UI applications, depending on the characteristics of your existing UI code. Integrating with a QWidget-based UIIf you have an existing QWidget-based UI, QML widgets can be integrated into it using QDeclarativeView. QDeclarativeView is a subclass of QWidget so you can add it to your user interface like any other QWidget. Use QDeclarativeView::setSource() to load a QML file into the view, then add the view to your UI: QDeclarativeView *qmlView = new QDeclarativeView; qmlView->setSource(QUrl::fromLocalFile("myqml.qml")); QWidget *widget = myExistingWidget(); QVBoxLayout *layout = new QVBoxLayout(widget); layout->addWidget(qmlView); The one drawback to this approach is that QDeclarativeView is slower to initialize and uses more memory than a QWidget, and creating large numbers of QDeclarativeView objects may lead to performance degradation. If this is the case, it may be better to rewrite your widgets in QML, and load the widgets from a main QML widget instead of using QDeclarativeView. Keep in mind that QWidgets were designed for a different type of user interface than QML, so it is not always a good idea to port a QWidget-based application to QML. QWidgets are a better choice if your UI is comprised of a small number of complex and static elements, and QML is a better choice if your UI is comprised of a large number of simple and dynamic elements. Integrating with a QGraphicsView-based UIAdding QML widgets to a QGraphicsSceneIf you have an existing UI based on the Graphics View Framework, you can integrate QML widgets directly into your QGraphicsScene. Use QDeclarativeComponent to create a QGraphicsObject from a QML file, and place the graphics object into your scene using QGraphicsScene::addItem(), or reparent it to an item already in the QGraphicsScene. For example: QGraphicsScene* scene = myExistingGraphicsScene(); QDeclarativeEngine *engine = new QDeclarativeEngine; QDeclarativeComponent component(engine, QUrl::fromLocalFile("myqml.qml")); QGraphicsObject *object = qobject_cast<QGraphicsObject *>(component.create()); scene->addItem(object); The following QGraphicsView options are recommended for optimal performance of QML UIs:
Loading QGraphicsWidget objects in QMLAn alternative approach is to expose your existing QGraphicsWidget objects to QML and construct your scene in QML instead. See the graphics layouts example which shows how to expose Qt's graphics layout classes to QML in order to use QGraphicsWidget with classes like QGraphicsLinearLayout and QGraphicsGridLayout. To expose your existing QGraphicsWidget classes to QML, use qmlRegisterType(). See Extending QML Functionalities using C++ for further information on how to use C++ types in QML. [Previous: Using QML Bindings in C++ Applications] [Next: Dynamic Object Management] © 2008-2011 Nokia Corporation and/or its subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation in Finland and/or other countries worldwide. All other trademarks are property of their respective owners. Privacy Policy Licensees holding valid Qt Commercial licenses may use this document in accordance with the Qt Commercial License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and Nokia. Alternatively, this document may be used under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. |