Многоуровневое наследование 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 специально для этого класса.