模拟qobject_cast失败

时间:2012-02-27 17:21:21

标签: c++ python qt plugins

我有一个纯虚拟类A,我做了

Q_DECLARE_INTERFACE(A, "org.something.A")

我有一个实现为B类的插件,它继承了A和QObject,具有作为接口A并实现A的所有纯虚方法

class B : public QObject, public A
{
    Q_OBJECT
    Q_INTERFACES(A)

    public:
        void someMethod();
}

和cpp:

Q_EXPORT_PLUGIN2(A, A)

这很有效。实际上有许多不同的接口,核心应用程序(我没有编写,我无法进行大的修改)调用

qobject_cast<A *>(bPointer);

并检查结果以了解某个插件是否实现了接口。

这一切都很有效。

但是,我希望在B类中在运行时确定是否要实现某个接口。

这些方法总是会被实现,但是我希望有时候让qobject_cast失败但是在运行时确定(单个实例总是会失败或者在同一个接口上成功)。

这可能听起来很奇怪,但其原因是我想添加Python(或其他语言)插件。他们会有一个C ++包装器。他们的python源代码将使用rcc文件存储。对于所有python插件,c ++代码应该是相同的。

c ++包装器将调用python方法来确定哪些接口是由python代码实现的,如果python代码没有实现到接口,则使qobject_cast失败。 C ++包装器类将实现所有接口方法并将调用转发给python,但只有成功转换的那些才真正被调用。

通过重新实现QObject的元相关方法可能是可行的,但我不知道哪个。

我希望你明白我尝试做什么(虽然不是很清楚)。也许有一种完全不同的方式来做这件事?

由于

1 个答案:

答案 0 :(得分:0)

您无法仅使用公共 Qt API更改qobject_cast行为。 另请注意,每个插件库只能有一个插件对象实例。

解决方案将是一个插件,作为工厂工作并按请求返回接口。