【问题标题】:What is the correct way of Multiple inheritance in Qt/C++?Qt/C++中多重继承的正确方法是什么?
【发布时间】:2011-03-13 04:35:00
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt qt4 multiple-databases


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      今天有一个类似的问题here

      基本上,需要两件事:

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

      在此之后,qobject_cast 将与您的接口一起使用。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-12
        • 2015-04-12
        • 1970-01-01
        相关资源
        最近更新 更多