2011-12-20 21 views
34

私はC++/Qtのクラスでミックスを使用して、共通のインタフェースを持つウィジェットを大量に提供しようとしています。インタフェースは、それが他のウィジェットクラスの基本クラスとして定義されている場合、そのウィジェット自体がそれらの信号を持つように定義されます。すなわち以下を参照してください。問題が明らかになり、クラス階層を見てみると QObject複数の継承

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 
} 

は、私はWIDGET1はQWidgetから継承多重継承で恐ろしいダイヤモンド、へつまずいた、とSignalInterface、および両方QObjectを継承しているしています。これは問題を引き起こすでしょうか?

QObjectクラスが純粋な仮想である場合(この場合は該当しない)、この問題は簡単に解決できることがわかります。

可能な解決策は、ここでの問題は、私はすでにQWidgetから継承したコードの多くを持っていることであり、その苦痛にそれをハックする。別の方法があります

class Interface: public QWidget { 
Q_OBJECT 

signals: 
void IconChanged(QIcon); 
void titleChanged(QString); 
} 

class Widget1: public Interface { 

} 

でしょうか?

+0

http://stackoverflow.com/questions/17943496/declare-abstract-signal-in-interface-class/17943699#17943699 –

答えて

42

QObjectを残念ながら継承すると、mocに問題が発生します。

http://qt-project.orgから:

あなたは多重継承を使用している場合は、MOCは最初 継承されたクラスはQObjectをのサブクラスであることを前提としています。また、 最初に継承されたクラスだけがQObjectであることを確認してください。

私はデリゲートパターンのようなものを使用するか、IsA関係ではなくHasAで再作成することをお勧めします。

5

基本クラスがを個人的に継承する場合、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からそのクラスだけを継承します。

+0

Qt5.9を使用すると、この解決策はmocのコンパイル中にエラーが発生します生成されたファイル: 'static_cast': 'QObject *'から 'myClass *'へのあいまいな変換 –