【问题标题】:Simulate qobject_cast failure模拟 qobject_cast 失败
【发布时间】: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 在这里做你想做的事。相反,为什么不直接定义一个接口,其方法可以返回您想要在运行时控制的接口?

标签: c++ python qt plugins


【解决方案1】:

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

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

【讨论】:

  • 好的,谢谢。我有一个所有插件都实现的接口。我将为其添加一个bool implementsInterface(QString) 方法。 另外请注意,每个插件库只能有一个插件对象实例。 每个 python 插件都有一个插件库。但是包装器 code 将是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2016-06-27
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
相关资源
最近更新 更多