在现有的QT widget app UI里加载qml文档

利用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控件前绘制,而透明的解决机制不起作用导致。
    具体的看官网吧,自己也不是很理解了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值