QML 中引用 js 文件闪退问题

server/2024/10/11 13:21:35/

问题描述

在移植 Android 中遇到这样一个引用兼容性问题,起因是这样的,Windows 版本的采用了 QML 分离的方式加载,而 Android 版本又采用了 qrc 的方式。而 Qt 中的机制是采用 QML 分离方式时则使用相对路径的方式引用 js 文件,而采用 qrc 的方式则需要使用 qrc 的方式引用 js 文件。且两种方式不能同时使用。

在项目开发时使用了 Windows 下 QML 分离的方式加载,在 qml 文件中使用相对路径的方式引用了 js 文件,在 Android 环境下编译运行时程序闪退。

Windows 下引用方式

import "./js/ui.js" as UI

Android 下编译报错信息

无法找到 qrc:/qml/js/ui/js

验证过程

尝试过很多中方式来验证兼容性,最终找到一种比较巧妙的方式解决。

  1. 通过代码中平台判断区分,不可行,qml 头部区域不能使用判断语句
if(Qt.platform.os === "android")import "./js/ui.js" as UI
elseimport "qrc:/js/js/ui.js" as UI
  1. 引用两个 js,使用时分开,不可行,仍然会报错
import "./js/ui.js" as UI
import "qrc:/js/js/ui.js" as AUI// 使用时
Qt.platform.os === "android" ? AUI : UI

解决方案

在 qml 中仍然使用相对路径的方式,Qt Android 编译时自动转换为 qrc 方式加载。

根据 QT 编译时报错的信息 qrc:/qml/js/ui/js 可以判断系统将相对路径自动转换为了 qrc 的方式,所以只要正好使用相对路径时并转换为 qrc 的方式也可以使用。

通过分析发现,可以直接 qml.qrc 中引用的路径,将原来的 <qresource prefix="/qml"> 改为 <qresource prefix="/">,并且将 <qresource prefix="/js"> 下的 js 文件移动到 <qresource prefix="/"> 下,这样正好相对路径转换为 qrc 方式后可用。

修改前:

<RCC><qresource prefix="/qml"><file>main.qml</file><file>TitleBar.qml</file><file>CenterMain.qml</file><file>home/MachineStatus.qml</file><file>base/DCChisel.qml</file><file>base/DCPan.qml</file><file>base/FoldButton.qml</file><file>base/LedLight.qml</file><file>base/LedTag.qml</file><file>base/LineInfo.qml</file><file>base/RisableInput.qml</file><file>base/StatusIndicator.qml</file><file>base/TComboBox.qml</file><file>base/TElseTheme.qml</file><file>base/ToolTitle.qml</file><file>base/TSelector.qml</file><file>base/TSpinBox.qml</file><file>base/TWaitBox.qml</file><file>dialog/DateSelect.qml</file><file>dialog/LicenseConfirm.qml</file><file>dialog/InfoConfirm.qml</file><file>dialog/PasswordInput.qml</file><file>home/CncProgress.qml</file><file>home/NcInfo.qml</file><file>home/NcImage.qml</file><file>home/CncBar.qml</file><file>tool/ProcessPage.qml</file><file>tool/WorkMode.qml</file><file>tool/Setting.qml</file><file>tool/Monitor.qml</file><file>tool/Update.qml</file><file>tool/Maintain.qml</file><file>tool/mode/Offline.qml</file><file>tool/mode/LinkLogin.qml</file><file>tool/mode/AreaNet.qml</file><file>tool/mode/CloudDisk.qml</file><file>tool/mode/FabricateChisel.qml</file><file>tool/mode/FabricatePan.qml</file><file>tool/update/Lifecycle.qml</file><file>tool/update/fwUpdate.qml</file><file>tool/update/DCUpdate.qml</file><file>tool/update/SpindleUpdate.qml</file><file>DeviceList.qml</file><file>tool/setting/BusinessInfo.qml</file><file>tool/setting/CalibertionRecord.qml</file><file>tool/setting/CommandSettings.qml</file><file>tool/setting/MachineConfig.qml</file><file>tool/setting/ManualOperation.qml</file><file>tool/setting/ProcessParameter.qml</file><file>tool/setting/ResetToFactory.qml</file><file>tool/setting/ServoOperation.qml</file><file>tool/setting/SpindleExportation.qml</file><file>tool/setting/ToolAxisesCalc.qml</file><file>tool/setting/ToolPosition.qml</file><file>tool/setting/UpdateRecord.qml</file><file>home/Device.qml</file><file>tool/maintain/Calibration.qml</file><file>tool/maintain/DeviceInformation.qml</file><file>tool/maintain/ToolRecord.qml</file><file>tool/maintain/ToolStateBar.qml</file><file>tool/maintain/ToolControl.qml</file><file>tool/maintain/LogExport.qml</file><file>tool/maintain/HistroyRecord.qml</file><file>tool/maintain/ParamExportImport.qml</file><file>tool/maintain/SDCardConfig.qml</file><file>tool/maintain/BreakPointProcess.qml</file><file>home/MessageQueue.qml</file><file>tool/maintain/AutoReflueling.qml</file><file>tool/maintain/SpindleMT.qml</file><file>tool/maintain/WorkspaceMT.qml</file><file>tool/update/Panel_list.qml</file><file>tool/maintain/ToolConfig.qml</file><file>help/HelpPage.qml</file><file>help/Language.qml</file><file>help/CncUpdate.qml</file><file>help/Service.qml</file><file>OutageContine.qml</file><file>tool/DCList.qml</file><file>tool/maintain/ExitAffirm.qml</file><file>ContinueProcess.qml</file><file>tool/setting/RDCDebug.qml</file><file>tool/setting/rdc/RDCControl.qml</file><file>tool/setting/rdc/RDCParam.qml</file><file>base/TCell.qml</file><file>base/TMenuItem.qml</file></qresource><qresource prefix="/js"><file>js/cncParam.js</file><file>js/machineParam.js</file><file>js/func.js</file><file>js/servoParam.js</file><file>js/ui.js</file></qresource><qresource prefix="/"/>
</RCC>

修改后:

<RCC><qresource prefix="/"><file>main.qml</file><file>TitleBar.qml</file><file>CenterMain.qml</file><file>home/MachineStatus.qml</file><file>base/DCChisel.qml</file><file>base/DCPan.qml</file><file>base/FoldButton.qml</file><file>base/LedLight.qml</file><file>base/LedTag.qml</file><file>base/LineInfo.qml</file><file>base/RisableInput.qml</file><file>base/StatusIndicator.qml</file><file>base/TComboBox.qml</file><file>base/TElseTheme.qml</file><file>base/ToolTitle.qml</file><file>base/TSelector.qml</file><file>base/TSpinBox.qml</file><file>base/TWaitBox.qml</file><file>dialog/DateSelect.qml</file><file>dialog/LicenseConfirm.qml</file><file>dialog/InfoConfirm.qml</file><file>dialog/PasswordInput.qml</file><file>home/CncProgress.qml</file><file>home/NcInfo.qml</file><file>home/NcImage.qml</file><file>home/CncBar.qml</file><file>tool/ProcessPage.qml</file><file>tool/WorkMode.qml</file><file>tool/Setting.qml</file><file>tool/Monitor.qml</file><file>tool/Update.qml</file><file>tool/Maintain.qml</file><file>tool/mode/Offline.qml</file><file>tool/mode/LinkLogin.qml</file><file>tool/mode/AreaNet.qml</file><file>tool/mode/CloudDisk.qml</file><file>tool/mode/FabricateChisel.qml</file><file>tool/mode/FabricatePan.qml</file><file>tool/update/Lifecycle.qml</file><file>tool/update/fwUpdate.qml</file><file>tool/update/DCUpdate.qml</file><file>tool/update/SpindleUpdate.qml</file><file>DeviceList.qml</file><file>tool/setting/BusinessInfo.qml</file><file>tool/setting/CalibertionRecord.qml</file><file>tool/setting/CommandSettings.qml</file><file>tool/setting/MachineConfig.qml</file><file>tool/setting/ManualOperation.qml</file><file>tool/setting/ProcessParameter.qml</file><file>tool/setting/ResetToFactory.qml</file><file>tool/setting/ServoOperation.qml</file><file>tool/setting/SpindleExportation.qml</file><file>tool/setting/ToolAxisesCalc.qml</file><file>tool/setting/ToolPosition.qml</file><file>tool/setting/UpdateRecord.qml</file><file>home/Device.qml</file><file>tool/maintain/Calibration.qml</file><file>tool/maintain/DeviceInformation.qml</file><file>tool/maintain/ToolRecord.qml</file><file>tool/maintain/ToolStateBar.qml</file><file>tool/maintain/ToolControl.qml</file><file>tool/maintain/LogExport.qml</file><file>tool/maintain/HistroyRecord.qml</file><file>tool/maintain/ParamExportImport.qml</file><file>tool/maintain/SDCardConfig.qml</file><file>tool/maintain/BreakPointProcess.qml</file><file>home/MessageQueue.qml</file><file>tool/maintain/AutoReflueling.qml</file><file>tool/maintain/SpindleMT.qml</file><file>tool/maintain/WorkspaceMT.qml</file><file>tool/update/Panel_list.qml</file><file>tool/maintain/ToolConfig.qml</file><file>help/HelpPage.qml</file><file>help/Language.qml</file><file>help/CncUpdate.qml</file><file>help/Service.qml</file><file>OutageContine.qml</file><file>tool/DCList.qml</file><file>tool/maintain/ExitAffirm.qml</file><file>ContinueProcess.qml</file><file>tool/setting/RDCDebug.qml</file><file>tool/setting/rdc/RDCControl.qml</file><file>tool/setting/rdc/RDCParam.qml</file><file>base/TCell.qml</file><file>base/TMenuItem.qml</file><file>js/cncParam.js</file><file>js/machineParam.js</file><file>js/func.js</file><file>js/servoParam.js</file><file>js/ui.js</file></qresource>
</RCC>

http://www.ppmy.cn/server/9070.html

相关文章

代码随想录训练营23day-贪心算法

一、贪心算法 贪心算法核心思想是局部最优&#xff0c;以确定全局最优。当然需要使用数学归纳去总结&#xff0c;但是实际应用过程&#xff0c;可以举反例来验证是不是可以使用贪心算法。参考代码随想录 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出…

python Django中分配库存给用户包括定义库存模型、用户模型、以及一个用于分配库存的逻辑

在Django中分配库存给用户通常涉及几个步骤&#xff0c;包括定义库存模型、用户模型、以及一个用于分配库存的逻辑。以下是一个基本的示例来说明如何执行这个过程&#xff1a; 1. 定义模型 首先&#xff0c;你需要定义两个模型&#xff1a;一个是User模型&#xff08;可以使用…

Lustre架构介绍的阅读笔记-SMB协议

本文是在阅读Introduction to Lustre* Architecture的Lustre SMB Gateway System Architecture时的笔记。 Lustre只支持Linux系统&#xff0c;但借助Samba可以支持SMB协议&#xff0c;进而对Windows主机提供文件访问能力。 参考资料 Welcome to the CTDB web pages CTDB is …

供应链投毒预警 | 开源供应链投毒202403月报发布啦!(含投毒案例分析)

悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;能够第一时间捕获开源组件仓库中的恶意投毒攻击。在2024年3月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff0…

Ubuntu不能启动,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

管理 Python 项目的艺术:在 PyCharm 中使用虚拟环境(以BPnP为例)

在 PyCharm 中使用虚拟环境对于 Python 项目开发具有多方面的重要作用&#xff0c;这些作用体现在提升项目管理的效率、保障代码的可运行性以及维护项目的长期稳定性等方面。以下是使用虚拟环境的几个关键好处&#xff1a; 1. 依赖管理和隔离 虚拟环境允许每个项目拥有…

新加坡VPS服务器Linux系统的安全性如何增强

增强新加坡VPS服务器上Linux系统的安全性是至关重要的&#xff0c;以下是一些常见的方法和建议&#xff1a; 更新系统和软件&#xff1a; 定期更新操作系统和安装的软件包&#xff0c;确保系统中的所有组件都是最新版本&#xff0c;以修补已知的漏洞和安全问题。 配置防火墙&am…

.NET Core中间件管道MAP的作用和使用

在ASP.NET Core中&#xff0c;中间件是构建HTTP请求管道的基本组件。中间件组件负责在ASP.NET Core应用程序中处理请求和响应。中间件可以执行多种任务&#xff0c;例如身份验证、记录、异常处理等。你可以按顺序将多个中间件组件组合在一起&#xff0c;形成一个请求处理管道。…