QML和C++混合编程--Qt声明式用户界面运行环境

来源:互联网 发布:航天科技 知乎 编辑:程序博客网 时间:2024/05/22 13:52

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示例程序。




  




0 0