目标是想出一种方法来保护您的QML代码免遭gi窃。这是一个问题,因为在这方面,QML的设计和实现方式似乎不受保护。受到某种程度保护的唯一QML类型是完全用C ++实现的QML类型。
总而言之,Qt似乎在蓄意削弱QML代码保护,一个明显的候选原因是迫使人们购买具有QML编译器功能的疯狂表达商业许可证。
因此缺乏保护QML源的任何常用方法,我现在想到的唯一解决方案是控制QML类型的解析方式。有几种方法可以将类型注册到QML:
但是,我需要手动解析QML类型,就像您可以创建一个自定义QQuickImageProvider
来输入URL字符串并输出图像一样,我需要QML引擎向我的自定义组件请求具有该类型的字符串提供者,该对象输出准备好对象实例化的组件。
如果使用任何自定义实例化机制,这将很容易,但是我需要那些类型在常规QML源中可用。理想情况下,在查看可用的导入路径甚至内部注册的类型之前,这应该是用于解析类型的第一种机制。
或者,如果有一种完全用C ++定义QML模块,没有任何外部QML文件,没有qmldir
文件等的方法,它将同样有用。
作为最后的选择,并且与理想情况有所欠缺,我也愿意为运行时注册QML(不是C ++)类型,这也可能有用,但是我更希望对解析过程进行完全控制。] >
[QML插件并不能解决问题,因为它注册了C ++类型,而我想注册QML类型,即从字符串源创建并相互引用的QQmlComponent
。
目标是想出一种方法来保护您的QML代码免遭gi窃。这是一个问题,因为在这方面,QML的设计和实现方式似乎不受保护。 ...
选项A)使用qtquick编译器
经过一番挖掘,我发现了两个可能值得追求的方向:
使用QML引擎的自定义QQmlAbstractUrlInterceptor
解析QML类型并返回QUrl
,在“受保护”类型的情况下,拦截器可以在自定义方案之前。使用自定义QNetworkAccessManager
拦截该url,为不受保护的类型调用默认实现,对于受保护的类型,解密数据并将其返回到QNetworkReply
。
qmlRegisterType
具有重叠的形式,可以接受表示[qrc]中qml文件的QUrl
:qmlRegisterType(QUrl("qrc:/YourQMLModule.qml"), "YourModule", 1, 0, "YourQMLModule");
看起来就像您注册了普通的C ++类。它经常在Qt的官方资料中使用,尽管在文档中缺少。