在Qt/C++中,多重继承的正确方式是什么?

13

在我的Qt应用程序中,我有一个如下的基类。我使用QObject是因为我想在所有派生类中使用信号槽机制。

class IRzPlugin : public QObject {

public:
  virtual void registerMenu(QWidget*);
  virtual void execute();
}

我有另外一个类如下所示。 我需要从QWidget继承,因为我需要在所有派生类中实现事件处理方法(例如mouseMoveEvent()keyPressEvent()和其他方法)。

class IRzLayeringPlugin : public IRzPlugin , public QWidget{

}

但是编译器会给出以下错误:

C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const':
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1
2个回答

9
在当前版本中,不能在派生类的多重继承路径中使用 QObject(例如您的 IRzLayeringPlugin 类)。我见过的唯一解决方案是创建一个没有任何 QObject 继承但具有与您想要使用的 QObject 函数直接对应的函数的接口类,然后在您的特定类中实现接口和其他 QObject 类继承之间的桥梁。这很快就会变得丑陋起来。

8

今天有一个类似的问题在这里

基本上需要两件事:

  • 在接口类声明之后添加Q_DECLARE_INTERFACE
  • 将接口添加到类的Q_INTERFACES宏中

完成后,qobject_cast就能与您的接口一起使用了。

如果您想要从接口中使用信号和槽,则很遗憾,因为只能对派生自QObject的类型进行操作。但在这种情况下,您将始终收到'QObject' is an ambiguous base of 'IRzLayeringPlugin'错误。

在这种情况下,@Caleb的想法仍然是最好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接