【问题标题】:How to package custom controls in QML?如何在 QML 中打包自定义控件?
【发布时间】:2017-03-04 15:25:09
【问题描述】:

我想创建一个 QML 自定义控件库,并提供给我的客户。同时,我不希望我的客户通过查看 QML 源代码来“逆向工程”我的控件。

避免这种情况的最佳选择是什么?理想的情况是我将我的控件作为编译库提供,他们可以将其导入自己的项目中。

我的目标平台是 iOS 和 Android。

【问题讨论】:

    标签: qt qml qtquick2 qtquickcontrols


    【解决方案1】:

    如何为自定义 QML 控件创建包?这些控件 请勿以源代码形式打包,防止逆向工程。

    问题暗示作者使用 QML 技术本身(不是 C++)实现了 QML 自定义控件。否则,这已经是QML C++ PlugIn,并以编译库或其他形式的本机代码的形式提供(我们可以只注册 QML 类型并从可执行文件中提供必要的导入)。

    要实现QML PlugIn(仅使用 QML 源代码),我们应该创建特殊类型的项目。将其组织为嵌套的 subdir project 很方便,以使其与应用程序的其余部分一起工作。请注意,一个插件项目可能包含许多新的 QML 类型。

    为了使 QML 代码不可见,我们现在可以使用在某些 Qt 许可下可用的Qt Quick compiler 对其进行编译。

    【讨论】:

      【解决方案2】:

      当为静态链接构建时,从 5.7 开始,Qt 会将 QML 模块构建为共享库,将 qml 文件作为资源嵌入,而不是从文件系统中使用它们。所以这将是一种方法,使用静态 Qt 构建并将您的自定义控件构建为模块。

      here 已经概述了另一种可能的方法,尽管要复杂得多。

      【讨论】:

      • 将 QML 源代码打包成静态构建的可执行文件会阻止它被看到吗?我会用一些查看器实用程序打开可执行文件,然后查找/查看文本块。该格式被压缩或混淆?
      • 如果您指定压缩,它将被压缩,这是您所希望的最好的,您需要调整阈值设置以确保尽可能多的 qml 文件被压缩,一些文本会你仍然可以阅读。正如在第二个链接解决方案 OP 中所讨论的那样,QML 绝对没有提供任何保护代码免受抄袭、混淆、加密、任何内容的方法,也没有任何保护措施可以防止对部署在用户系统上的 qml 文件进行恶意更改。跨度>
      • @ddriver 我不确定如何按照您的建议设置我的项目。在 Qt creator 中,我可以创建一个只有 C++ 的插件项目。如何为静态构建设置 QML 模块项目?我如何在我的主应用程序项目中引用它(假设我对两个项目都使用 QtCreator 并且它们都在我的“工作区”中打开)?我也安装了 Qt 5.8,所以使用 qtquickcompiler 工具可能是一个可行的选择
      • 根据我的需要,将 QML 源代码嵌入到二进制库(共享或静态)中是可以接受的。如果客户偷看那个库,无论如何他都会违反合同(老实说,我不确定客户会走那么远)。我不想做的是通过提供现成的 QML 来“让事情变得简单”。
      • 嗯,没那么简单。您将需要一个静态 Qt 构建开始。然后您将需要检查库存 QML 模块的实现并以相同的方式执行您的操作,然后使用您的静态构建构建以生成包含模块的 QML 文件的二进制文件。这不仅仅是您可以检查和瞧的一些选项。 Qt 并没有让这些事情变得容易;)
      【解决方案3】:

      QML 文件可以包含在 QRC profile 中,并在带有 "qrc:/" 的代码中使用。 在构建时,它们会被包含在目标二进制文件中,从而保护它们免受杂乱无章的观察。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-14
        • 2020-10-28
        • 2018-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多