繁体   English   中英

如何使用 MSVC 2019 创建和使用 Qt 5.14.0 自定义小部件插件?

[英]How to create and use Qt 5.14.0 custom widget plugins with MSVC 2019?

我终于解决了这个有趣的谜语,所以我会回答我自己的问题。 虽然它让我发疯了,所以我想它可能会帮助一些程序员。

问题定义

我想做的似乎相当简单:创建我自己的小部件并将其集成到我自己的 Qt Creator(在我的本地机器上运行的版本,与标准 Qt 安装一起提供)以便我可以自由地使用它来设计我自己的与临时 GUI 设计工具的接口。

推广通用QWidget就足够了,只是不太方便。
我认为在 GUI 设计工具中看到小部件(而不是一个不可见的矩形)并且可以修改特定属性(而不是必须以编程方式进行)会很好。
不幸的是,这并没有像我希望的那样顺利。

我什至不能对我自己的编译器负责!

使用:

  • 全新重新格式化的系统上的原始 Win 10,没有安装任何以前的编译器
  • 标准安装程序下载的默认免费版 MSVC 2019(桌面 C++ 开发包、工具链 v14.26、编译器 v16.4)
  • 默认当前 Qt v5.14.0(MinGW 和 MSVC2017 目标),由标准 Qt 安装程序下载。

我首先天真地为 x64 编译示例( 时钟小部件)。 什么都没发生。 然后是x86。 结果相同或没有。
在尝试为 MinGW 编译它之前,我实际上意识到这在概念上是错误的。
很明显,生成的 DLL 必须与实际 Qt Creator 的本机格式相匹配,因此这种 makefile 神奇地向当前 Qt Creator 二进制文件添加插件的想法完全是垃圾。
我放弃了如意算盘,开始手动将适当的 DLL 放在适当的位置。

那就是我永远误入歧途的地方。

我很快看到 Qt 5.14.0 附带的 Qt Creator 可执行文件已经用 MSVC2017 在 win32 模式下编译(在“关于”窗口中说明,尽管没有明确说明编译器和/或工具链的精确版本,只是这个相当不可靠的“MSVC2017”,它也用于指定实际的 MSVC2019 环境)。

示例项目中定义的路径导致一些神秘的 MSVC2017 子树,其中什么都没有发生。
将 DLL 放在那里没有任何效果。 删除已经存在的那些也没有效果。
显然,我的 Qt Creator 版本从未使用过任何这些 DLL。 我不知道它们应该有什么用,坦率地说,我一点也不在乎。 这只是另一条寒冷的足迹,浪费了我更多的时间。

查看 Qt Creator 的“关于插件..”窗口,我注意到那里列出的所有插件都位于<Qt install root>\Qt\Tools\QtCreator\lib\qtcreator\plugins\ (如打开的窗口中所述单击“详细信息”按钮时)。 我错误地认为这是所有插件都应该去的地方。 然而,将标准示例(可爱的小时钟部件)的结果放入该目录中根本没有任何作用。

然后我花了一整天的时间试图理解为什么在大火中这个该死的插件不会出现。

由于当前的 MSVC 集成有些古怪(Qt 在使用二进制兼容的 MSVC2019 时仍然指的是 MSVC2017),我开始尝试使用 v14.16 Microsoft 工具链(最后一个使用 MSVC2017,可以通过 Web 安装程序安装)。

我从来没有设法让这个该死的旧版本的工具链工作。
坦率地说,这个 Qt/VS 集成是一个泥潭。 它归结为调用这个可怕的“vcvarsall.bat”命令文件,该文件设置了一大堆神秘的环境变量。 碰巧的是,vcvarsall.bat 需要一个 Qt 无法传递的额外命令行参数 ( -vcvars_ver=14.16 )(它认为编译器定义无效……真倒霉……)。
您仍然可以将调用包装到另一个批处理文件 ( @vcvarsall.bat %* -vcvars_ver=14.16 ) 并将其提供给 Qt 编译器设置。 但即便如此,我也永远无法将这该死的东西编译出来。
我丢失了包括什么的。 显然,IDE 必须对任何文件位置做出一些其他假设,这些假设使得无法在“自动检测”的 MSVC 版本(即当前状态下的 MSVC2019 当前版本)之外工作。

在浪费了所有这些痛苦的时间之后,我非常生气,所以我再次搜索了 Qt 论坛,并被无数(主要是 Linux)关于路径和编译器选项的讨论搞得一团糟。 浪费的时间更多。 实际上,很多时间。

在最后一次孤注一掷的尝试中,我使用了漂亮的进程资源管理器(没错,监视可执行文件打开的所有资源)来定位我正在运行的 Qt Creator 副本使用的 DLL。 那是我终于找到 go[beep]mn 目录的时候。

从那以后,一切都非常顺利。 只需编译您的小 DLL 并将其放在正确的位置,Bob 就会成为您的叔叔。

有点废话

有两个信息可能会让您认为设计器插件位于Qt\Tools\QtCreator\lib\qtcreator\plugins (“关于插件...”窗口报告的路径)或Qt/5.14.0/msvc2017/plugins/designer (示例项目使用的神秘安装路径)

两者都是错误的和误导性的。

另一个传说假装 Qt Creator 可执行文件需要完全相同版本的编译器来生成兼容的插件。

这又是一句废话。 您可以很好地使用 MSVC2019 编译该工具的当前版本,该版本显然是使用 MSVC2017 编译的(尽管关于窗口没有说明工具链或编译器的确切版本,唉)。

您所需要的只是一个二进制兼容的 DLL(显然),这意味着从二进制兼容的 Microsoft 编译器进行 Win32 编译(就二进制兼容性而言,理论上它可能与 MSVC2015 一样古老,但显然只有最新版本的工具链可能永远有效,这纯粹是出于学术兴趣)。

甚至不需要在发布模式下编译,显然调试 DLL 也能正常工作。

试图使以前版本的 MSVC 正常工作不仅是一场充满未记录和神秘故障的噩梦,而且完全没有用。

解决方案是...

只需在 WIn32/release 模式下构建 MSVC 2019(Qt 出于某种原因称为 MSVC2017)的项目,并将 go[beep]mn 生成的 DLL 放入此目录:

<Qt install root>\Qt\Tools\QtCreator\bin\plugins\designer

是的,没错。 你得到一个Qt\Tools\QtCreator\lib\qtcreator\plugins ,其中似乎发生了奇怪的事情,但永远不会加载“小部件插件”,另一个Qt\Tools\QtCreator\bin\plugins有一堆子目录,包括“designer”文件夹,您的小“widget plugin”最终将在其中活跃起来。

您还会从各种 Qt 论坛线程中得到很多废话和/或过时的技巧。 显然,Qt 正在使用大量不同的“插件”进行爬行,这些“插件”并不都在同一个小屋里,并且喜欢随每个新的次要版本一起迁移……我在 Qt 文档中也找不到有用目录的提示或列表。 相信我,我确实阅读了很多 Qt 文档。

顺便说一句,要使用您的可重用小部件,您仍然需要提供它们的源代码或接口标头以及一些用于链接的 DLL/LIB。
这个“插件”是将您的小部件集成到 GUI 编辑器的好方法,但它不会安装包含您的小部件及其接口标题的库(这确实是一个漂亮的技巧:))。

该死的噩梦。 但现在一切都结束了,玩我的自定义小部件美眉是一件很有趣的事情。 耶...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM