【发布时间】:2012-02-27 17:21:21
【问题描述】:
我有一个纯虚类 A,我在上面做
Q_DECLARE_INTERFACE(A, "org.something.A")
我有一个插件实现为继承 A 和 QObject 的类 B,具有接口 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的meta相关方法或许可行,但不知道是哪个。
我希望你能理解我试图做什么(虽然不是很清楚)。也许有一种完全不同的方式来做到这一点?
谢谢
【问题讨论】:
-
我怀疑有什么方法可以让 qobject_cast 在这里做你想做的事。相反,为什么不直接定义一个接口,其方法可以返回您想要在运行时控制的接口?