我有一个纯虚拟类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的元相关方法可能是可行的,但我不知道哪个。
我希望你明白我尝试做什么(虽然不是很清楚)。也许有一种完全不同的方式来做这件事?
由于
答案 0 :(得分:0)
您无法仅使用公共 Qt API更改qobject_cast
行为。
另请注意,每个插件库只能有一个插件对象实例。
解决方案将是一个插件,作为工厂工作并按请求返回接口。