QML 中引用 js 文件闪退问题

问题描述

在移植 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.mzph.cn/diannao/1127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZCMU 1531: 序列的混乱程度

Description 有一个长度为n的正整数序列&#xff0c;一个序列的混乱程度定义为这个序列的最大值和最小值之差。请编写一个程序&#xff0c;计算一个序列的混乱程度。 Input 输入的第一行为一个正整数T (T<1000)&#xff0c;表示一共有T组测试数据。 每组测试数据的第一行为一…

前后端跨域请求代码实战(vue3.4+springboot2.7.18)

前端代码 v3.4.21&#xff08;前端不是主业&#xff0c;所以就贴一贴代码&#xff0c;有疑问评论区见&#xff09;后端代码&#xff0c;springboot 2.7.18&#xff08;后端&#xff09; 文章内容&#xff1a; 一&#xff0c;后端代码 二&#xff0c;前端代码 三&#xff0c;后…

【ARM 裸机】I.MX 启动方式之启动头文件 1

接上一节&#xff1a;【ARM 裸机】I.MX 启动方式之启动设备的选择&#xff1b; 2、启动头文件 当 BOOT_MODE1 为 1&#xff0c;BOOT_MODE0 为 0 的时候此内部 BOOT 模式&#xff0c;在此模式下&#xff0c;芯片会执 行内部的 BOOT ROM 代码&#xff0c;这段 BOOT ROM 代码会进…

C++引用和指针的区别

在C中&#xff0c;引用和指针都是用于间接访问变量或对象的工具&#xff0c;但它们之间存在一些重要的区别。 引用&#xff08;Reference&#xff09; 引用是变量的别名&#xff0c;它提供了一个已经存在的变量的另一个名字。一旦一个引用被初始化为一个对象&#xff0c;就不…

tensor是pytorch的核心,那torch.tensor和torch.Tensor区别是?

本文重点 从本节课程开始我们将正式开启pytorch的学习了&#xff0c;在深度学习框架中有一个重要的概念叫做张量&#xff0c;它是pytorch的基本操作单位&#xff0c;要想创建tensor有很多的方式&#xff0c;但是有两个torch.tensor和torch.Tensor容易混淆&#xff0c;本节课程…

javase__进阶 day13stream流和方法引用

1.不可变集合 1.1 什么是不可变集合 ​ 是一个长度不可变&#xff0c;内容也无法修改的集合 1.2 使用场景 ​ 如果某个数据不能被修改&#xff0c;把它防御性地拷贝到不可变集合中是个很好的实践。 ​ 当集合对象被不可信的库调用时&#xff0c;不可变形式是安全的。 简单…

docker快速使用简介

进入服务器 ssh root192.0.0.211安装 docker load < bevformer_image.tar修改镜像的REPOSITORY和TAG docker tag a6a4c15ca9db bevformer:1.0其中&#xff0c;a6a4c15ca9db是原来镜像的id。bevformer是修改后的REPOSITORY&#xff1b;1.0是修改后的TAG。 从Docker Hub上…

高精度加减乘除

高精度加法 题目链接&#xff1a;高精度加法 #include <bits/stdc.h> #define int long long using namespace std; const int N 1e55; int a[N],b[N]; int c[N]; int n,m; string s1,s2;signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>s1…

大厂面试精华面试刷题

1.自定义unshift实现相同效果 2.数组去重 用vs2019来写这种练习题可以更直观的查看代码执行的效果&#xff0c;最后的代码是控制控制台执行完毕后不自动关闭 use strict;let arr [1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10] //1.//查重最简单的方法for循环结合splice从数组中…

Flask vs FastApi 性能对比测试

Flask和Fastapi都是Python下流行的Web框架&#xff0c;前者有大量拥趸&#xff0c;是一个老牌框架&#xff0c;后者相对较新&#xff0c;但是利用了异步技术和uvloop&#xff0c;都说性能比Flask好很多&#xff0c;于是就我就对比实测一下。由于Windows下不支持uvloop&#xff…

63、ARM/STM32中IIC相关学习20240417

完成温湿度传感器数据采集实验。 【思路&#xff1a;1.通过IIC通信原理&#xff0c;理解其通信过程&#xff0c;通过调用封装的IIC函数达成主机和从机之间&#xff1a;起始信号、终止信号、读、写数据的操作&#xff1b; 2.了解温湿度传感器控制芯片SI7006的工作原理&#…

【C++】飞机大战项目记录

源代码与图片参考自《你好编程》的飞机大战项目&#xff0c;这里不进行展示。 本项目是仅供学习使用的项目 飞机大战项目记录 飞机大战设计报告1 项目框架分析1.1 敌机设计&#xff1a;1.2 玩家飞机控制&#xff1a;1.3 子弹发射&#xff1a;1.4 游戏界面与互动&#xff1a;1.5…

解决Linux根分区空间不足的方法:利用Home分区进行扩容

前言 在进行系统安装时&#xff0c;一个常见的困扰是默认分区设置可能导致home分区拥有过多的空间&#xff0c;而root分区却显得十分紧缺。这种情况下&#xff0c;用户往往会陷入无法继续安装软件或存储文件的困境。本文将向您展示如何通过合理的调整&#xff0c;将home分区中多…

二叉排序树及实现

二叉排序树及实现 二叉排序树&#xff08;Binary Sort Tree, BST&#xff09;又称为二叉查找树。在一般情况下&#xff0c;查询效率要比链表结构要高。对于二叉排序树中的任何一个非叶子节点&#xff0c;要求左子节点的值比当前节点的值小&#xff0c;右子节点的值比当前节点的…

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论&#xff1a;一般用inner join来改写in和exist&#xff0c;用left join来改写not in&#xff0c;not exist&#xff1b;&#xff08;本文会比较内连接&#xff0c;包含in子句的子查询&#xff0c;exist的性能 &#xff09; 1. 本文总结自高性能mysql 6…

Python 面向对象——1.基本概念

本章学习链接如下&#xff1a; 基本概念与语法 类&#xff08;Class&#xff09;&#xff1a;定义了一组对象共有的属性和方法的蓝图。类是创建对象的模板。 对象&#xff08;Object&#xff09;&#xff1a;类的实例。对象包含实际的数据和操作数据的方法。 属性&#xff0…

NLP_知识图谱_三元组实战

文章目录 三元组含义如何构建知识图谱模型的整体结构基于transformers框架的三元组抽取baselinehow to use预训练模型下载地址训练数据下载地址 结构图代码及数据bertconfig.jsonvocab.txt datadev.jsonschemas.jsontrain.jsonvocab.json 与bert跟data同个目录model.pytrain.py…

原型和原型链--图解

https://juejin.cn/post/7255605810453217335 prototype是函数的属性&#xff08;一个对象&#xff09;&#xff0c;不是对象的属性&#xff0c;普通函数和构造函数的prototype属性是空对象&#xff5b;&#xff5d;&#xff08;其实有2个属性&#xff0c;一个是constructor&a…

Vue3: toRefs与toRef的基本使用

一、前言 本文主要介绍toRefs与toRef的基本使用。 二、内容 1、基本概念 作用: toRefs与toRef可以将一个响应式对象中的每一 个属性&#xff0c;转换为ref对象&#xff1b;不同 toRefs与toRef功能一致&#xff0c;但toRefs可以批量转换。 2、toRefs 如果把reactive定义的…

记录交叉编译环境配置--海思开发板的 嵌入式nginx和 php的移植

嵌入式 lnmp搭建的记录 一些交叉编译的配置环境思路分享&#xff1a;P&#xff1a;php编译PHP可能遇到的问题configure阶段&#xff1a;Makefile-make阶段&#xff1a;Makefile-make install阶段&#xff1a; N&#xff1a;Nginx 文章比较水&#xff0c;并没有没解决什么实际问…