c – 使用动态插件处理Qt5中的QMetaType注册

c – 使用动态插件处理Qt5中的QMetaType注册,第1张

概述我的公司正在考虑从Qt 4.8.4跳到Qt 5.4,但是我遇到了一个可能对我们来说是一个改变的变化:QMetaType :: unregisterType()被删除( http://doc.qt.io/qt-5/sourcebreaks.html). 我们的GUI需要在运行时加载插件,在GUI会话期间可能会多次加载和卸载相同的插件.在Qt 4中,我们遇到了一个问题,当第二次加载插件时,任何使用插件 我的公司正在考虑从Qt 4.8.4跳到Qt 5.4,但是我遇到了一个可能对我们来说是一个改变的变化:QMetaType :: unregisterType()被删除( http://doc.qt.io/qt-5/sourcebreaks.html).

我们的GUI需要在运行时加载插件,在GUI会话期间可能会多次加载和卸载相同的插件.在Qt 4中,我们遇到了一个问题,当第二次加载插件时,任何使用插件注册的自定义类型的信号/插槽都会导致访问冲突,因为元类型已经注册了插件的第一个实例(现在已卸载,因此内存空间无效).我们通过定义我们自己的宏来解决这个问题,以便在加载和卸载插件时安全地注册和取消注册元类型.

由于QMetaType :: unregisterType()不再存在,我担心这个问题会回来,没有真正解决问题的方法.升级到Qt 5.4将是一个重要的投资,甚至可以测试我可以测试这个问题,所以我希望我能从这里的专家那里得到一些指示.

有没有办法在Qt 5中取消注册元类型?如果没有,Qt 5现在是否有某种系统可以检测DLL何时被卸载并取消注册元类型本身(我不太可能认为)?或者,如果我们切换到新的Qt 5信号/插槽语法,这是否完全免除了我们对元类型的需求?如果是这样,新语法是否仍允许排队连接?请原谅我对这个问题的无知,但我没有看到它明确列为支持或不支持.

解决方法

Please forgive my ignorance on the subject,but I don’t see it explicitly Listed as supported or not.

目前这是不受支持的,这意味着在写这篇文章时不要用Qt 5卸载插件.通常,您无论如何都不会加载和卸载插件,因为它通常在启动期间完成.存储库中的corresponding change还声称:

The function hasn’t been working properly. It was not well tested,for example it is undefined how QVariant should behave if it contains an instance of an unregistered type.

Concept of unregistering types was inspired by plug-in system,but in most supported platforms we do not unload plug-ins.

IDea of type unregistering may block optimizations in Meta object system,because it would be not possible to cache a type ID. QMetaType::type() Could return different IDs for the same name.

因此,即使您认为它正在工作,它也是不可靠的,这意味着您可能已经观察到难以发现其 *** 作中的错误,从而导致您不可靠的软件.我相信你不想发布这样的软件,特别是如果Qt项目不推荐使用它.

总结

以上是内存溢出为你收集整理的c – 使用动态插件处理Qt5中的QMetaType注册全部内容,希望文章能够帮你解决c – 使用动态插件处理Qt5中的QMetaType注册所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1227449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存