C++ Qt/C+中多重继承的正确方式是什么+;?
在我的Qt应用程序中,我有一个基类,如下所示。我使用的是C++ Qt/C+中多重继承的正确方式是什么+;?,c++,qt,qt4,multiple-databases,C++,Qt,Qt4,Multiple Databases,在我的Qt应用程序中,我有一个基类,如下所示。我使用的是QObject,因为我想在所有派生类中使用信号槽机制 class IRzPlugin : public QObject { public: virtual void registerMenu(QWidget*); virtual void execute(); } 然后我有另一节课,如下所示。我需要从QWidget扩展,因为我需要在所有派生类中实现事件处理方法(例如mouseMoveEvent(),keyPressEvent()
QObject
,因为我想在所有派生类中使用信号槽机制
class IRzPlugin : public QObject {
public:
virtual void registerMenu(QWidget*);
virtual void execute();
}
然后我有另一节课,如下所示。我需要从QWidget
扩展,因为我需要在所有派生类中实现事件处理方法(例如mouseMoveEvent()
,keyPressEvent()
和其他)
但编译器给出了以下错误:
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
在当前版本中,不可能在派生类的多个继承路径中使用
QObject
(如IRzLayeringPlugin
类)。我见过的唯一解决方案是创建一个没有任何QObject
继承的接口类,但其函数直接对应于要使用的QObject
函数,然后在特定类中实现接口和其他QObject
类继承之间的桥梁。它很快就变丑了。今天也有一个类似的问题
基本上,需要两件事:
- 在接口类声明之后添加
Q\u DECLARE\u接口
- 将接口添加到类的
宏Q_INTERFACES
“QObject”是“IRzLayeringPlugin”的一个模棱两可的基础。
错误
在这种情况下,@Caleb的想法仍然是最好的
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