我的公司正在考虑从Qt4.8.4跳到Qt5.4,但我遇到了一个可能会阻止我们的改变:QMetaType::unregisterType()被删除(http://doc.qt.io/qt-5/sourcebreaks.html)。
我们的GUI需要在运行时加载插件,在GUI会话期间,可能加载和卸载的插件都是相同的。在Qt 4中,我们遇到一个问题,当第二次加载插件时,任何使用插件注册的自定义类型之一的信号/插槽都会导致访问冲突,因为元类型已被插件的第一个实例注册(现在已卸载,因此内存空间无效)。为了解决这个问题,我们定义了自己的宏,以便在插件加载和卸载时安全地注册和取消注册元类型。
由于QMetaType::unregisterType()不再存在,我担心这个问题将无法真正解决问题。升级到Qt5.4将是一个很大的投资,我甚至可以测试这个问题,所以我希望我能从这里的专家那里得到一些提示。
有没有办法取消Qt 5中的元类型注册?如果没有,Qt 5现在是否有某种系统可以检测DLL何时被卸载并注销元类型本身(我认为极不可能)?或者,如果我们切换到新的Qt 5信号/插槽语法,这是否完全免除了我们对元类型的需求?如果是这样的话,新语法是否仍然允许排队连接?请原谅我在这个问题上的无知,但我不认为它被明确列为支持或不支持。
发布于 2014-12-17 22:55:58
请原谅我在这个问题上的无知,但我不认为它被明确列为支持或不支持。
这目前是不受支持的,这意味着在编写这篇文章时,不要卸载带有Qt 5的插件。通常,您不会加载和卸载插件无论如何,因为它是在启动期间一般。存储库中的相应变化还声明:
功能还没有正常运作。它没有经过很好的测试,例如,如果QVariant包含一个未注册类型的实例,那么它的行为是没有定义的。 注销类型的概念是由插件系统启发的,但在大多数支持的平台中,我们不卸载插件。 类型注销的想法可能会阻止元对象系统中的优化,因为缓存类型id是不可能的。QMetaType::type()可以返回相同名称的不同ids。
因此,即使您认为它是工作的,它也是不可靠的,这意味着您可以观察到它的操作中很难找到错误,从而导致您的软件不可靠。我相信您不想发布这样的软件,特别是如果Qt不推荐使用它的话。
https://stackoverflow.com/questions/27527041
复制相似问题