利用widget写好一个APP的UI了,现在想将后期的qml资源用现有的UI显示出来,网上找了下发现QT提供了一个现成的类来处理,这就是 QQuickWidget
qml,qt quick关系
qml是什么:
QML是一种用户界面规范和编程语言。
QML提供了一种可读性强,声明性的,类似JSON的语法,支持与动态属性绑定相结合的命令式JavaScript表达式。qt quick是什么:
Qt Quick是QML的类型和功能的标准库。
它包括视觉类型,交互式类型,动画,模型和视图,粒子效果和着色效果。 QML应用程序开发人员可以使用import语句导入Quick库来访问所有的Qt Quick提供的类型和功能。
qt中图形绘制的简单理解
三个概念:
- view:视窗,可理解为用于呈现场景中的内容的窗口。
它还提供对场景的管理(比如一个小视窗看一幅大场景的图,视窗可以提供了滚动条来浏览,还有缩放旋转等),用于接收事件信息,并翻译后传递给场景里的对象(比如把事件坐标转换成对应的场景坐标) scene:场景,用于容纳和管理Item的容器(比如Item是否选中,有焦点吗等)。场景可被渲染(render)到视窗上
item:构件、对象,放置于场景内,构成图形的元素
要实现item的显示,首先将item加入到scene中,然后将scene置于view中,就可以显示了。
qt quick app中的qml资源显示
一般在qt quick 应用程序中快速显示qml等文件是用QQuickView,他是继承自QQuickWindow 。两者区别看下面
QQuickView
The QQuickView class provides a window for displaying a Qt Quick user interface.(提供一个用于显示Qt Quick用户界面的窗口。)
它是QQuickWindow的一个方便的子类,当给定主源文件的URL时,它可以自动加载和显示一个QML场景。
QQuickWindow
The QQuickWindow class provides the window for displaying a graphical QML scene(提供用于显示图形QML场景的窗口)
QQuickWindow提供了与QQuickItems交互和显示场景所需的图形场景管理。任何一个QQuickWindow总是有一个隐藏的root item。要将items添加到此窗口,须将items重定义父对象(reparent)为root item或场景中的现有item。
注明:QQuickWindow是利用openGL的顶层图层场景(a scene graph on top of OpenGL)来渲染,这一图层场景跟QML的图层场景没有关联,基于你使用的平台实现,它可能单独开一个线程处理。所以当它完全释放时不会影响qml场景的状态。
示例:
/*记得在pro中添加库*/ QQuickView view; view.setSource(QUrl::fromLocalFile("myqmlfile.qml")); if (view.status() == QQuickView::Error) return -1; view.show();
如果用QQuickWindow 则如下
QQmlApplicationEngine engine; engine.load(QUrl("myqmlfile.qml")); QObject *topLevel = engine.rootObjects().value(0); QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel); window->show();
qt widget app中显示qml
若要在widget中显示qml,那就需要用到QQuickWidget 控件。
QQuickWidget
The QQuickWidget class provides a widget for displaying a Qt Quick user interface.(提供一个用于显示Qt Quick用户界面的控件)
eg:
QQuickWidget *view = new QQuickWidget; view->setSource(QUrl::fromLocalFile("myqmlfile.qml")); view->show();
或者用设计器直接拖一个QQuickWidget放到主窗口上,直接用setSource方法就行。
注:QQuickWidget不能用于需要严格层叠的控件上,而且由于QQuickWidget要渲染到openGL的帧缓存对象里,所以比起QQuickWindow和QQuickView来说性能要弱些。更重要的是,使用它后,平台上所有的线程渲染循环(threaded render loop)都被禁用了,这会导致一些线程渲染的好处无法使用了,如比Animator classes 和vsync driven animations。
- 限制
在QQuickWidget下层放(underneath)些小控件并将QQuickWidget设置成透明的是不会如你预想的那样能看见低下的小部件的。这是由于QQuickWidget是在所有常规的,非openGL控件前绘制,而透明的解决机制不起作用导致。
具体的看官网吧,自己也不是很理解了。