Как правильно использовать множественное наследование в Qt / C ++? - PullRequest
10 голосов
/ 08 июля 2010

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

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

Ответы [ 3 ]

6 голосов
/ 08 июля 2010

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

6 голосов
/ 16 сентября 2010

Сегодня был похожий вопрос здесь .

В принципе, необходимы две вещи:

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

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

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

В этом случае идея @ Калеба все еще лучшая.

2 голосов
/ 08 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...