Каков правильный способ множественного наследования в 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
базовый класс включается более одного раза в производный класс. Вам нужно использовать виртуальные базовые классы для решения проблемы.