Многоуровневое наследование QObject
Я пытаюсь использовать mix в классах для С++/Qt, чтобы предоставить целую кучу виджетов с общим интерфейсом. Интерфейс определен таким образом, что если он определяется как базовый класс для других классов виджетов, то сам виджет будет иметь эти сигналы. т.е. см. ниже.
class SignalInterface: public QObject {
Q_OBJECT
public:
SignalInterface();
virtual ~SignalInterface();
signals:
void iconChanged(QIcon);
void titleChanged(QString);
}
class Widget1: public SignalInterface, QWidget{
public:
Widget1()
virtual ~Widget1()
// The Widget Should Inherit the signals
}
Посмотрев на иерархию классов, проблема становится очевидной, я наткнулся на страшный бриллиант в Multiple Inheritance, где Widget1 наследует от QWidget и SignalInterface, и те, которые наследуются от QObject. Это вызовет какие-либо проблемы?
Мы знаем, что эта проблема может быть легко решена, если класс QObject является чисто виртуальным (что не так).
Возможное решение:
class Interface: public QWidget {
Q_OBJECT
signals:
void IconChanged(QIcon);
void titleChanged(QString);
}
class Widget1: public Interface {
}
Проблема в том, что у меня уже есть много кода, который наследуется от QWidget, и его больно взломать это. Есть ли другой способ?
Ответы
Ответ 1
К сожалению, наследование QObject
дважды вызовет проблемы в moc
.
От http://qt-project.org:
Если вы используете множественное наследование, moc предполагает, что первый inherited class является подклассом QObject. Кроме того, убедитесь, что первый унаследованный класс - это QObject.
Я бы предложил использовать что-то большее, чем шаблон делегата, или воссоздать с помощью HasA не отношения IsA.
Ответ 2
Qt допускает множественное наследование, если базовый класс наследует конфиденциально от QObject.
Пример:
class Base: private QObject {
Q_OBJECT
/*Can use signals and slots like any other QObject-derived class*/
};
class Derived1: public Base {
/*Cannot use signals/slots because it does not "see" that Base inherits from QObject*/
};
class Derived2: public QWidget, public Base {
Q_OBJECT
/*Can use signals/slots plus has all the functionality of QWidget and Base*/
};
Конечно, частное наследство - это совсем другое животное, и оно не может дать вам решение, которое вам действительно нужно. То, что я использую для этого, - это когда я могу уйти с использованием сигналов/слотов только в базовом классе. Когда мне действительно нужно поведение QObject
в производном классе, я наследую от QObject
специально для этого класса.