2011-12-20 219 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