1. QML文件通过QML运行环境进行加载和执行。
这包括声明式用户界面引擎和内建的QML元素与插件模块,它允许对第三方QML元素和模块的访问。
使用QML的应用程序需要调用QML运行环境来执行QML运行环境来执行QML文档,这可以通过创建QDeclarativeview或者QDeclarativeEngine来完成。
另外,声明式用户界面包含了Qt QML Viewer工具,它可以用来加载.qml文件。该工具可以用来开发和测试QML代码,而不需要编写C++应用程序来加载QML运行环境。
Qt Declarative UI Runtime,Qt QML Viewer。
2. 要部署使用了QML的应用程序,必须在应用程序中调用QML运行环境。
这可以通过编写一个Qt C++应用程序,然后通过QDeclarativeView实例来加载QML文件,
或者创建一个QDeclareEngine实例然后使用QDeclarativeView实例来加载QML文件。具体使用哪种方法依赖于已经存在的用户界面代码的特点。
Integrating QML with existing Qt UI code关键字
一、使用QDeclarativeView来部署
如果已经拥有一个基于QWidget的用户,可以使用QDeclarativeView将QML部件整合进来。QDeclarativeView是QWidget的子类,所以可以像其他QWidget部件一样将其添加到用户界面。使用QDeclarativeView::setSource()来加载一个QML文件到视图中,然后将该视图添加到用户界面中。
在.pro中添加代码
QT + = declaretive
必须添加declaretive模块才可以在Qt程序中显示QML文件的内容。
#include <QDeclarativeView>
QDeclarativeView view;
view.setSource(QUrl("../myDeclarativeView/application.qml"))
view.show();
使用这种方式缺点:与QWidget相比,QDeclarativeView初始化很慢,而且会使用更多的内存。如果创建了大量的QDeclarativeView对象会导致性能下降。如果发生了这种情况,一个比较好的方法是在QML中重写这些部件,然后在主QML部件中加载这些部件,而不要使用QDeclarativeView。
注意,与QML相比,QWidget是为多种不同类型的用户界面设计的,所以将基于QWidget的应用程序和QML相连接并不总是一个好主意。如果用户界面是由少量复杂的静态元素组成,那么最好使用QWidget部件来实现;而如果用户界面由大量简单和动态的元素组成,那么最好使用QML来实现。
二、直接创建一个QDeclarativeEngine
如果在application.qml中没有包含任何的图形组件,或者由于其他原因需要避免使用QDeclarativeView,那么就可以直接创建QDeclarativeEngine。在这种情况下,application.qml会被作为一个QDeclarativeCompnent实例进行加载,而不是显示在一个视图中。
#include <QDeclarativeEngine>
#include <QDeclarativeContext>
#include <QDeclarativeComponent>
QDeclarativeEngine engine;
QDeclarativeContext * objectContext =
new QDeclarativeContext(engine.rootContext());
QDeclarativeComponent component(&engine, "application.qml");
QObject * object = component.create(objectContext);
如果已经拥有了一个基于图形视图框架的用户界面,那么可以使用这种方式直接将QML部件整合到QGraphicsSence中。例如将QML部件整合到QGraphicsScene中。
QGraphicsScene * scene = myExistingGraphicsScene();
QDeclarativeEngine * engine = new QDeclarativeEngine;
QDeclarativeComponent component(engine, Qurl::fromLocalFile("application.qml"));
QObject * object =
qobject_cast<QGraphicsObject *>(component.create());
scene->addItem(boject);
使用QGraphicsView选项可以优化QML用户界面的表现:
QGraphicsView::setOptimizationFlags(QGraphicsView::DontSavePainterState);
QGraphicsView::setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
QGraphicsScene::setItemIndexMethod(QGraphicsScene::NoIndex);
还有一种方法是将现有的QGraphicsWidget对象暴露给QML,并且在QML中创建场景。参考Basic Graphics Layouts Example示例程序。