Каков правильный способ множественного наследования в Qt / C++?

в моем приложении Qt у меня есть базовый класс, как показано ниже. Я использую QObject, потому что хочу использовать механизм слота сигнала во всех производных классах.

class IRzPlugin : public QObject {

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

тогда у меня есть другой класс, как следовать. Мне нужно расширить QWidget, потому что мне нужно реализовать методы обработки событий во всех производных классах.(mouseMoveEvent (), keyPressEvent ()..и т. д.);

class IRzLayeringPlugin : public IRzPlugin , public QWidget{

}

но компилятор выдает следующие ошибки:

C:svnosaka3dtagsiter08prototypeosaka3drinzopluginmoc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const':
C:svnosaka3dtagsiter08prototypeosaka3drinzopluginmoc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
C:svnosaka3dtagsiter08prototypeosaka3drinzopluginmoc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1

3 ответов


в текущем воплощении невозможно использовать QObject в нескольких путях наследования для производного класса (например, ваш IRzLayeringPlugin класс). Единственным решением, которое я когда-либо видел, было создание класса интерфейса без каких-либо QObject наследование, но с функциями, которые непосредственно соответствуют QObject функции вы хотите использовать, а затем реализовать мост между интерфейсом и другие QObject наследование классов в вашем конкретном классе. Это становится уродливым довольно быстро.


сегодня был аналогичный вопрос здесь.

в основном, необходимы две вещи:

  • добавлять Q_DECLARE_INTERFACE после объявления класса интерфейс
  • добавление в интерфейс Q_INTERFACES макрос класс

после этого, qobject_cast будет работать с вашим интерфейсом.

Если вы хотите использовать сигналы и слоты от интерфейсов, вам не повезло, потому что вы можете делать это только с типами это происходит от QObject. Но в этом случае вы всегда получите 'QObject' is an ambiguous base of 'IRzLayeringPlugin' ошибка.

в этом случае идея @Caleb по-прежнему лучшая.


на QObject базовый класс включается более одного раза в производный класс. Вам нужно использовать виртуальные базовые классы для решения проблемы.