簡體   English   中英

QObject多重繼承

[英]QObject Multiple Inheritance

我正在嘗試在 C++/Qt 的類中使用 mix 來提供一大堆具有通用接口的小部件。 接口以這樣的方式定義,如果它被定義為其他小部件類的基類,那么小部件本身將具有這些信號:

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繼承自QWidgetSignalInterface ,並且兩者都繼承自QObject 這會導致任何問題嗎?

我們知道,如果QObject類是純虛擬的(事實並非如此),這個問題很容易解決。

一個可能的解決方案是:

class Interface: public QWidget {
Q_OBJECT

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

class Widget1: public Interface {

}

這里的問題是我已經有很多從QWidget繼承的代碼,並且很難破解它。還有其他方法嗎?

不幸的是,繼承QObject兩次會導致moc出現問題。

來自http://qt-project.org

如果您使用多重繼承,則moc 假定第一個繼承的類是 QObject 的子類 另外,請確保只有第一個繼承的類是 QObject

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

如果基類從 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

為什么使用繼承,為什么不使用組合 例如,您可以按以下方式重寫案例:

class IMyWidgetSignals : public QObject
{
    Q_OBJECT
signals:
    void iconChanged(QIcon);
    void titleChanged(QString);
};

//------------------------------------------------------------------------------

class IMyWidget {
public:
    IMyWidget () {}
    // virtual functions:
    // ...
    
    IMyWidgetSignals _signals;
};


//------------------------------------------------------------------------------

class Widget1: public QWidget, public IMyWidget
{
public:
    using QWidget::QWidget;
}
//------------------------------------------------------------------------------

int main(...)
{
    
    Widget1 w1;
    w1.show();

    QObject::connect(&w1._signals, &IMyWidgetSignals::iconChanged, [] (const auto &icon) { 
        // ... do smth with icon
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM