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

时间:2010-07-08 06:53:54

标签: c++ qt qt4 multiple-databases

在我的Qt应用程序中,我有一个基类如下。我正在使用QObject,因为我想在所有派生类中使用Signal-Slot机制。

class IRzPlugin : public QObject {

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

然后我有另一个课程如下。我需要从QWidget扩展,因为我需要在所有派生类中实现事件处理方法。(mouseMoveEvent(),keyPressEvent().. etc);

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

今天有一个类似的问题here

基本上,需要做两件事:

  • 在接口类声明
  • 之后添加Q_DECLARE_INTERFACE
  • 将界面添加到班级的Q_INTERFACES

在此之后,qobject_cast将与您的界面一起使用。

如果您想使用接口中的信号和插槽,那么您运气不好,因为您只能使用从QObject派生的类型。但在这种情况下,您总是会收到'QObject' is an ambiguous base of 'IRzLayeringPlugin'错误。

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

答案 2 :(得分:2)

QObject基类在派生类中被多次包含。您需要使用virtual base classes来解决问题。