01【原创】QWidget如何平滑过渡到Qt Quick

Qt Quick优势

1.在以往项目的开发过程中,对于PC端 UI的需求,我们使用QWidget完全能够在主流桌面操作系统上实现跨平台的开发工作;但是当遇到可触碰交互的用户界面,并要求在除了主流桌面操作系统,在移动操作系统上也要实现可观的产品时,Qt Quick的适配性更好

2.同时使用C++与Qt标记性语言QML,如果你已经熟悉了这套开发流程,你会发现这种相较于原有QWidget的开发,这种开发对View模块的隔离更加彻底,后端应用逻辑使用C++,QML开发用户界面,并有MVD模式可以使用,大大提高开发效率

3.Qt Quick默认使用OpenGL ES,渲染效率很高,并且提供了属性动画等基本动画对象以及用于组合多个动画对象的分组动画对象,在实现有关动画方面的需求,会更加方便

在原有QWiget项目中嵌入Qt Quick

如果当前的需求仅仅是要开发一个新的产品或者一个全新的模块,建议直接选择Qt Quick;但是在实际的业务场景里,我们往往会遇到,由于QWidget完成的项目业务积累足够庞大,导致部分需求的开发使用Quick开发成本过高,所以下面我会根据实际的业务开发场景给出两个技术方案供选择。

方案1.业务不是很独立,是原有业务的一部分,并且依赖QWidget的组件,以及QWidget的属性,使用QQuickWidget

了解QQuickWidget,打开Qt帮助文档通过索引搜索QQuickWidget,会看到非常详细的官方解释:TheQQuickWidgetclass provides a widget for displaying a Qt Quick user interface。也就是说我们在能够兼容所有的QWidget属性以及与原有QWidget组件进行无差别衔接的同时,可以使用QML进行界面的编写。但是一定要打开更多来观看更详细的Detailed Description,因为这里会有几个关键Note,告诉我们对原有QWidget业务进行无缝衔接的同时,使用QML要付出的代价。

Note1:QQuickWidget的灵活,是以牺牲性能为代价的。与QQuickWindow和QQuickView不同,QQuickWidget涉及渲染到render到OOpenGL帧缓冲区对象,这个会带来轻微的性能损失(这里可以埋个坑,后续一起讨论QQuick的渲染机制)

Note2:QQuickWidget将禁用所有平台上的线程render loop,例如Animator类和vsync驱动的动画不能使用

Note3:避免在QQuickWidget上调用winId()。这个函数会触发本机窗口的创建,导致性能降低,并可能出现渲染问题。

所以在使用QQuickWidget的灵活性的同时,要谨记以上三个Note

方案2.全新的项目或者非常独立的业务,使用QQuickView,将会使用原汁原味的QML与C++进行混合开发

了解QQuickView,同样打开Qt帮助文档通过索引搜索QQuickWidget(无论了解什么,先去Qt帮助文档查询)TheQQuickViewclass provides a window for displaying a Qt Quick user interface.点击更多查看详细信息。QQuickView是QQuickWindow的派生类,当给定主源文件的URL时候,会自动加载显示QML场景。

总结:无论是QQuickWidget还是QQuickVIew,在编码过程中的使用大同小异,通过代码编写发现问题,解决问题。

参考资料

【1】QmlBook-In-Chinese 第二章 Get Start

【2】Qt Quick核心编程 第一章 Qt Quick 概览

【3】Qt Quick核心编程 第四章 Qt Quick 入门

【4】Qt Assistant QQuickWidget,QQuickView

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Qt/QML 编码规范 一. 概述 良好的编码规范可以大幅提高程序的可读和可理解性,最终目标是实现更友好的可维护性...
    赵者也阅读 2,258评论 0 5
  • 嵌入式Linux的Qt 在嵌入式Linux系统上,可以使用多个平台插件:EGLFS,LinuxFB,DirectF...
    YottaYuan阅读 17,686评论 0 9
  • 2.概览 本章将介绍如果开始使用 Qt 5 进行开发。将展示如何安装 Qt SDK,以及如何使用 Qt Creat...
    赵者也阅读 1,540评论 3 2
  • Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改。Qt 5 引入了模块化的概念,将众多功能细分到几个模...
    飞扬code阅读 1,400评论 1 3
  • 大家好,我是吉米,这是一系列Qt Quick相关技术教程的首篇。这个教程构思已久,却从未动手,被自己的拖延症再一次...
    吉米有态度阅读 9,905评论 1 7