Qt 如何在QML中打包自定义控件?

Qt 如何在QML中打包自定义控件?,qt,qml,qtquick2,qtquickcontrols,Qt,Qml,Qtquick2,Qtquickcontrols,我想创建一个QML自定义控件库,提供给我的客户。同时,我不希望我的客户通过窥探QML源代码来“反向工程”我的控件 我最好的选择是什么来避免这种情况?理想的情况是,我将控件作为一个编译库提供,它们可以在自己的项目中导入 我的目标平台是iOS和Android 如何为自定义QML控件创建包?这些控件 不应以源代码形式打包,以防止反向工程 这个问题意味着作者使用QML技术本身(而不是C++)实现了QML自定义控件。否则,这将已经在表单编译库或其他形式的本机代码中提供(我们只需注册QML类型并从可执行文件

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

我最好的选择是什么来避免这种情况?理想的情况是,我将控件作为一个编译库提供,它们可以在自己的项目中导入

我的目标平台是iOS和Android

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

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

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


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

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


另一种可能的方法,虽然要复杂得多,但已经概述了。

QML文件可以包含在中,并在代码中使用
“qrc:/”

在构建时,它们会被包含在目标二进制文件中,以保护它们免受不明确的注意。

将QML源代码打包到静态构建的可执行文件中是否会阻止它被看到?我会用一些查看器工具打开可执行文件,然后查找/查看文本块。该格式已压缩或模糊?如果指定压缩,它将被压缩,这是您所能期望的最好结果,您将需要调整阈值设置,以确保尽可能多的qml文件被压缩,一些文本仍然可读。正如在第二个链接解决方案OP中所讨论的,QML绝对不能保护代码不被剽窃、不被混淆、不被加密,也不能保护代码不被恶意更改用户系统上部署的QML文件。@ddriver我不确定如何按照您的建议设置我的项目。在Qt创建者中,我可以创建一个插件项目,它只是C++。如何为静态构建设置QML模块项目?那么我如何在我的主应用程序项目中引用它(假设我对这两个项目都使用QtCreator,并且在我的“工作区”中都打开了它们)?我还安装了Qt5.8,因此使用qtquickcompiler工具可以满足我的需要,将QML源代码嵌入二进制库(共享或静态)是可以接受的。如果客户尽可能地偷看那个lib,他无论如何都会违反合同(老实说,我不确定客户会走那么远)。我不想做的是通过提供随时可用的QML来“使事情变得容易”。其实并没有那么简单。首先需要一个静态Qt构建。然后,您需要检查库存QML模块的实现,并以相同的方式执行您的操作,然后使用静态构建生成包含模块QML文件的二进制文件。这不仅仅是一些你可以检查和观看的选项。Qt不会让这些事情对你来说很容易;)