公司新闻MSC行业新闻Qt行业新闻行业新闻QtSquishCocoTest CenterAxivionQt系列产品MSC AdamsMSC NastranMSC MARCSimufact.WeldingCAE FatigueRomaxMSC系列产品SimericsProcastVA ONESYSWELD国外工业软件国产动力学分析软件(DAP)国产疲劳分析软件国产复合材料热压罐成型工艺优化软件试验数据快速处理分析系统软件国产结构(微纳尺度)分析软件国产工业软件超高周疲劳材料、构件测试产品检测可靠性测试设备特种光纤器具硬件产品(MCT)行业解决方案学科解决方案技术方案MSC系列产品培训Qt系列产品培训技术培训MSC系列资源下载中心Qt系列资源下载中心Simerics资源下载中心文档下载
我们致力于推动科技创新,以先进的技术和优质的服务为企业创造更大的价值
办公室电话:
028-80269112
欢迎您访问南通玛尔斯科仿真科技有限公司!

知识 | 将QML编译为C++:QtQuick Controls和可选导入

发表时间:2022-09-20 16:20
本文翻译自Compiling QML to C++: QtQuick Controls and optional imports
原文作者:
Qt公司高级软件工程师Ulf Hermann
校审:Tengxiao Yu

本文是关于如何优化QML应用程序以充分利用qmlsc的系列博文的第六篇。在第一篇中,我们搭建了运行环境。为了便于理解后续文章,建议您先阅读第一篇。

这次我将展示如何处理由Qt自身模块提供的可选导入。在编译导入QtQuick.Controls的任何QML文件时,您将收到此类消息:


Warning: QtQuick.Controls uses optional imports which are not supported. Some types might not be found.

这还会间接导致如下的问题:



Warning: CategoryLabel.qml:145:9: unknowngroupedpropertyscopeanchors.anchors.verticalCenter: txt.verticalCenter

因为qmlsc不知道QtQuick.Controls的类型,也不知道它们能够提供锚点。这是一个ImageToolButton,派生自QtQuick.Controls提供的ToolButton。由于qmlsc不知道其分配绑定的属性类型,因此无法编译绑定值。

使用QML Profiler进行性能分析发现,anchors.verticalCenter的26次绑定赋值耗时54.2微秒,其中JavaScript执行耗时29.5微秒。

这条警告信息是什么意思呢?QtQuick.Controls在不同的平台上会使用不同的样式。在Windows上,它通常使用 "windows" 样式,在macOS上使用"macOS" 样式等。但是,您可以在运行时设置QT_QUICK_CONTROLS_STYLE环境变量,通过配置文件以及其他多种方式覆盖默认的样式。这意味着,在我们导入QtQuick.Controls时,qmlsc不知道它会提供什么类型。它可以是任何可用样式中的类型。

我们可以在编译时指定要使用的样式来解决这个问题。由于我们的Timeline模块几乎在任何地方都会使用QtQuick.Controls,因此最简单的方法就是从CMakeLists.txt中的模块定义中导入我们想要使用的特定样式。根据平台或我们可能需要的其他标准,在该处使用CMake选择不同的样式。我们将模块配置更改如下,并从各个QML文件中删除所有的QtQuick.Controls导入:
























if(WIN32)set(QUICK_CONTROLS "QtQuick.Controls.Windows")elseif(APPLE)set(QUICK_CONTROLS "QtQuick.Controls.macOS")else()set(QUICK_CONTROLS "QtQuick.Controls.Basic")endif()
qt_add_qml_module(Tracing   URI "QtCreator.Tracing"   VERSION "1.0"   NO_PLUGIN   DEPENDENCIES    QtQuick   IMPORTS${QUICK_CONTROLS}   QML_FILES${TRACING_QML_FILES}   RESOURCES${TRACING_QML_RESOURCES}   SOURCES${TRACING_CPP_SOURCES})

事实上,我们不能在Qt Creator上进行这样的修改,因为用户很重视他们对Qt Creator的样式风格的选择,无论他们使用的是什么桌面环境。如果您正在开发一个严格控制其样式风格的商业应用程序,而且可能会单独定制样式,那么您可能还是会希望在编译时修复该样式。在这种情况下,您还可以从将它的QML代码编译为C++的过程中获益。

应用此更改后,anchors.verticalCenter上的绑定值就可以编译为C++了。现在这26次调用耗时29微秒,其中13.7微秒用于JavaScript执行。与我们之前看到的54.1微秒和29.5微秒相比,这是一个相当显著的改进。

兼容性


Qt 5.14及以上版本均支持模块级导入,但在Qt 6之前的版本中存在许多缺陷。首先,在Qt 5中您不能使用qt_add_qml_module()。因此,您必须手动编写qmldir文件,或者自己编写构建系统代码来生成它们。其次,Qt 5中的qmldir “import”指令只有在以下情况下才会合理地运行:


  1. 相关的模块本身也声明了一些QML类型。

  2. 所有其他类型都是基于C++的(非.qml文件)。

  3. 模块有一个插件。您无法直接将其编译至您的应用程序中。


分享到:
全国统一服务热线:

028-80269112

咨询邮箱xianghui.li@bjmars.cn



关注微信公众号
了解最新动态
下载中心