13

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

class IRzPlugin : public QObject {

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

然后我有另一堂课如下。我需要扩展 from,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
4

2 回答 2

8

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

于 2010-07-08T17:02:31.050 回答
8

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

基本上,需要两件事:

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

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

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

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

于 2010-09-16T13:52:56.600 回答