Posted on 2011-08-04 22:38
RTY 阅读(2658)
评论(0) 编辑 收藏 引用 所属分类:
转载随笔 、
QML
请尊重原创作品和译文。转载请保持文章完整性,并以超链接形式注明原始作者地址http://blog.csdn.net/changsheng230,方便其他朋友提问和指正。
将QML整合到基于QWidget UI程序的方法有很多种,而具体采用哪种方法取决于现有UI代码的特性。
与基于QWidget的UI整合
如果你已经有了一个基于QWidget的UI,QML widgets可以使用QDeclarativeView来进行集成。QDeclarativeView是QWidget的一个子类,所以你可以像加载其他QWidget一样把它加载进你的UI。 具体方法是使用QDeclarativeView::setSource()方法加载一个QML文件到视图中,然后将这个视图(即QDeclarativeView)加到你的UI中。
- QDeclarativeView *qmlView = new QDeclarativeView;
- qmlView->setSource(QUrl::fromLocalFile("myqml.qml"));
-
- QWidget *widget = myExistingWidget();
- QVBoxLayout *layout = new QVBoxLayout(widget);
- widget->addWidget(qmlView);
这种方法的缺点在于与QWidget相比,QDelarativeVeiw的初始化过程更慢,而且使用更多的内存。如果创建大量的QDelarativeVeiw对象可能会导致性能的下降。在这种情况下,更好的选择是用QML重写你的widgets,使用main QML widget来加载widget, 从而替代QDelarativeVeiw的滥用。
请注意,QWidgets的UI设计理念与QML并不相同,所以将基于QWidget的应用移植到QML并不总是一个好主意。如果你的UI是由少数几个复杂、静态的元素的组成,使用QWidgets是一个更好的选择。而如果你的UI是由大量简单、动态的元素组成,那么QML则是你的最佳选择。
与基于QGraphicsView的UI整合
将QML widgets加入到QGraphicsScene
如果你已经有了一个基于Graphics View Framework的UI,你可以直接将QML widgets集成到你的QGraphicsScene中。具体方法是使用QDeclarativeComponent 从QML文件中创建一个QGraphicsObject,并通过使用QGraphicsScene::addItem(), 方法把这个图形对象加到你的scene中,或者将其父化到已经存在与QGraphicsScene的组件中。举例说明:
>
- QGraphicsScene* scene = myExistingGraphicsScene();
- QDeclarativeEngine *engine = new QDeclarativeEngine;
- QDeclarativeComponent component(engine, QUrl::fromLocalFile("myqml.qml"));
- QGraphicsObject *object =
- qobject_cast(component.create());
- scene->addItem(object);
推荐使用下面的一些QGraphicsView选项来优化QML UIs的性能:
在QML中加载QGraphicsWidget 对象
另一个可供选择的方法是将你现有的QGraphicsWidget 对象暴露给QML,并且在QML中构建你的scene。请参见图形布局示例,它展示了如何结合QGraphicsWidget 、QGraphicsLinearLayout 以及QGraphicsGridLayout的使用,将Qt图形布局类暴露给QML。
为了将现有的QGraphicsWidget类暴露给QML,需使用qmlRegisterType()。在QML中使用C++型别的进一步信息,请参见在C++中拓展QML。 (译者注:也看参阅QML与C++混合编程使用)
英文原文出处:integrating QML with existing Qt UI code