2011-12-20 140 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類是純虛擬的(這不是這種情況),這個問題很容易解決。

一個可能的解決辦法是

class Interface: public QWidget { 
Q_OBJECT 

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

class Widget1: public Interface { 

} 

這裏的問題是,我已經有很多代碼,從QWidget的繼承,其痛苦的破解,在,是否有另一種方式?

+0

看看:http://stackoverflow.com/questions/17943496/declare-abstract-signal-in-interface-class/17943699#17943699 – 2014-12-08 15:41:25

回答

42

遺憾地繼承QObject兩次會導致moc出現問題。

http://qt-project.org

如果使用多重繼承,商務部假定第一 繼承的類是QObject的的子類。另外,請確保只有 第一個繼承類是QObject

我會建議使用更像委託模式的東西,或者用HasA而不是IsA關係重新創建。

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 *'的模糊轉換 – 2017-11-20 11:15:16