加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:10:29 所属栏目:百科 来源:网络整理
导读:我的公司正在考虑从Qt 4.8.4跳到Qt 5.4,但是我遇到了一个可能对我们来说是一个改变的变化:QMetaType :: unregisterType()被删除( http://doc.qt.io/qt-5/sourcebreaks.html). 我们的GUI需要在运行时加载插件,在GUI会话期间可能会多次加载和卸载相同的插件.
我的公司正在考虑从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项目不推荐使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读