从Q窃中保护QML源代码

问题描述 投票:7回答:4

目标是想出一种方法来保护您的QML代码免遭gi窃。这是一个问题,因为在这方面,QML的设计和实现方式似乎不受保护。受到某种程度保护的唯一QML类型是完全用C ++实现的QML类型。

  • Qt资源文件不支持任何程度的保护
  • 即使压缩资源文件,从中提取数据对于具有中等经验的任何人来说也是相当琐碎的
  • 实际上存储在文件系统中的QML文件可供使用
  • 同样适用于任何远程QML文件,除了增加对Internet连接的依赖性之外,还很容易嗅探网络访问并通过其URL获取QML文件。
  • QML似乎没有提供任何公共API以允许用户对QML类型的解析进行足够的控制以保护其代码

总而言之,Qt似乎在蓄意削弱QML代码保护,一个明显的候选原因是迫使人们购买具有QML编译器功能的疯狂表达商业许可证。

因此缺乏保护QML源的任何常用方法,我现在想到的唯一解决方案是控制QML类型的解析方式。有几种方法可以将类型注册到QML:

  • 在应用程序可执行文件中注册
  • 注册插件
  • 通过QML模块注册

但是,我需要手动解析QML类型,就像您可以创建一个自定义QQuickImageProvider来输入URL字符串并输出图像一样,我需要QML引擎向我的自定义组件请求具有该类型的字符串提供者,该对象输出准备好对象实例化的组件。

如果使用任何自定义实例化机制,这将很容易,但是我需要那些类型在常规QML源中可用。理想情况下,在查看可用的导入路径甚至内部注册的类型之前,这应该是用于解析类型的第一种机制。

或者,如果有一种完全用C ++定义QML模块,没有任何外部QML文件,没有qmldir文件等的方法,它将同样有用。

作为最后的选择,并且与理想情况有所欠缺,我也愿意为运行时注册QML(不是C ++)类型,这也可能有用,但是我更希望对解析过程进行完全控制。] >

[QML插件并不能解决问题,因为它注册了C ++类型,而我想注册QML类型,即从字符串源创建并相互引用的QQmlComponent

目标是想出一种方法来保护您的QML代码免遭gi窃。这是一个问题,因为在这方面,QML的设计和实现方式似乎不受保护。 ...

c++ qt qml qtquick2 type-resolution
4个回答
3
投票

(理想的解决方案:对其进行预编译


1
投票

选项A)使用qtquick编译器


0
投票

经过一番挖掘,我发现了两个可能值得追求的方向:

  • 使用QML引擎的自定义QQmlAbstractUrlInterceptor解析QML类型并返回QUrl,在“受保护”类型的情况下,拦截器可以在自定义方案之前。使用自定义QNetworkAccessManager拦截该url,为不受保护的类型调用默认实现,对于受保护的类型,解密数据并将其返回到QNetworkReply


0
投票
实际上,您可以在C ++中注册QML类型。函数qmlRegisterType具有重叠的形式,可以接受表示[qrc]中qml文件的QUrl

qmlRegisterType(QUrl("qrc:/YourQMLModule.qml"), "YourModule", 1, 0, "YourQMLModule");

看起来就像您注册了普通的C ++类。它经常在Qt的官方资料中使用,尽管在文档中缺少。
© www.soinside.com 2019 - 2024. All rights reserved.