2010-07-08 116 views
10

在我的Qt应用程序中,我有一个基类如下。我使用QObject是因为我想在所有派生类中使用Signal-Slot机制。Qt/C++中多重继承的正确方法是什么?

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 

回答

6

在当前化身中,不可能在派生类的多重继承路径中使用QObject(例如IRzLayeringPlugin类)。我见过的唯一解决方案是创建一个没有任何QObject继承性的接口类,但函数直接对应于您要使用的QObject函数,然后在接口和您的其他类继承之间实现桥接类。它变得很难看得很快。

+0

谢谢,那是我最后做的/ – 2010-07-09 01:19:10

3

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

+3

在这种情况下这是不可能的,因为'QWidget'需要从'QObject'实际导出。 – Job 2010-07-08 09:52:04

6

今天还有类似的问题here

基本上,需要做两两件事:接口类的声明

  • 接口加入了Q_INTERFACES宏类的
  • 在此之后后

    • 添加Q_DECLARE_INTERFACE,qobject_cast将与你的界面。

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

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