В моем спокойном приложении у меня есть базовый класс следующим образом. Я использую QObject, потому что я хочу использовать механизм Слота Сигнала во всех производных классах.
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
В текущем воплощении невозможно использовать QObject
в путях множественного наследования для производного класса (например, вашего класса IRzLayeringPlugin
). Единственное решение, которое я когда-либо видел, - это создать класс интерфейса без какого-либо наследования QObject
, но с функциями, которые напрямую соответствуют функциям QObject
, которые вы хотите использовать, а затем реализовать мост между интерфейсом и другим наследуемым классом QObject
в вашем конкретном классе. Довольно быстро это становится уродливым.
Базовый класс QObject
многократно включается в производный класс. Для решения проблемы необходимо использовать виртуальных базовых классов .