2011-12-20 2 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인지 확인하십시오.

대리자 패턴과 비슷한 것을 사용하거나 HasA가 아닌 관계로 다시 만들 것을 제안합니다.

5

기본 클래스가 개인적으로 QObject의을 상속 할 경우 Qt에서 다중 상속을 허용합니다.

예 : 물론

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 *'까지 모호한 변환 –