【问题标题】:Is it possible to implement Qt Application Plugin using a base and derived class?是否可以使用基类和派生类来实现 Qt 应用程序插件?
【发布时间】:2018-07-25 18:41:44
【问题描述】:

假设我有以下玩具界面:

class iTest{
  virtual ~iTest(void) = 0;
  virtual void doA(void) = 0;
  virtual void doB(void) = 0;
}

Q_DECLARE_INTERFACE(iTest, "somestring")

我想在两个类中实现它:Base 和 Derived。

class Base : public QObject, public iTest
{
  Q_OBJECT
  Q_PLUGIN_METADATA (IID "somestring")
  Q_INTERFACES(iTEST)
  explicit Base(QObject* parent=0);
  void doA(void); // do common thing all derived need do
  int data; // some data member all derived should have
}

class Derived: public Base
{
  Q_OBJECT
  Q_PLUGIN_METADATA (IID "somestring")
  Q_INTERFACES(iTEST)
  explicit Derived(QObject* parent = 0);
  void doB(); // do something custom dervived objects need do
}

我的错误推理告诉我这应该有效。插件的抽象基类为接口的一部分提供功能,而派生类构成接口的其余部分。我可以通过一些明智的删除宏(基类元数据宏)来编译它。但是,生成的插件不会加载。所以我认为我的推理有问题,有经验的 Qt 开发人员或 c++ 开发人员可能会指出我看不到。

【问题讨论】:

  • 所有这些Q_ 宏都由MOC 编译器处理,并将某些功能绑定到C++ 对象的一个​​实例。我们同时拥有BaseDerived 来“竞争”与一个实例相关的相同隐式功能。那时我不会做这样的 Qt 类设计。我宁愿从目标类中公开一次插件接口,但我们可以根据需要尽可能多的 iTest 子级。而且我们可以有很多目标插件,为什么不呢。这不是最终的答案,我自己想听听智者的意见。

标签: c++ qt multiple-inheritance qtplugin


【解决方案1】:

我相信我已经想出了一个解决方案。正如上面提到的 Alexander V,Base 和 Derived 类中的 Q_ 宏相互冲突。文档指出,代码中只能调用一次 Q_PLUGIN_METADATA 宏。我想到的是,基类本身甚至不需要是 Q_Object,它只是函数的容器。因此,我将这些类重新声明如下:

class Base: public iTest{
  void doA(void); // do something all derived should do
  int data; // data all derived should have
}

class Derived: public QObject, public Base{
  Q_OBJECT
  Q_PLUGIN_METADATA (IID "somestring")
  Q_INTERFACES(iTEST)  
  void doB(void): // custom to derived
}

另外,界面需要稍作修改:

...
  virtual ~iTest(void){}
...

这是因为析构函数需要定义,不能是纯虚函数。通过这些修改,这种结构似乎可以在我的应用程序中使用。

【讨论】:

  • 你的空virtual ~iTest(void){} 可以变成virtual ~iTest() = default,编译器会处理剩下的事情。另外,我认为在函数签名中添加 void 类型不是一种常见的做法,至少在 C++ 中,尤其是在析构函数中。
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2011-11-05
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多