Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt/C+中多重继承的正确方式是什么+;?_C++_Qt_Qt4_Multiple Databases - Fatal编程技术网

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

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()

在我的Qt应用程序中,我有一个基类,如下所示。我使用的是
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_cast将与您的接口一起工作

如果您想使用接口中的信号和插槽,那就太倒霉了,因为您只能使用从QObject派生的类型。但是在这种情况下,您总是会发现,
“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