Qt multiple inheritance and signals

前端 未结 3 522
名媛妹妹
名媛妹妹 2021-02-09 06:38

I\'m having a problem with QT regarding multiple enheritance because of QObject. I know that a lot of others have the same problems but I don\'t know how I should fix it.

<
相关标签:
3条回答
  • 2021-02-09 07:26

    Use virtual inheritence, e.g.

    class X : public virtual Y 
    {
    };
    
    class Z : public virtual Y
    {
    };
    
    class A : public virtual X, public virtual Z
    {
    };
    

    will only have one copy of the base class Y

    0 讨论(0)
  • 2021-02-09 07:31

    You should use virtual inheritance.

    see http://en.allexperts.com/q/C-1040/virtual-inheritance.htm

    Seems like you are experiencing the diamond issue, see also:

    http://www.cprogramming.com/tutorial/virtual_inheritance.html

    Do it like this:

    class NavigatableItem : public virtual QObject
    class Button : public virtual NavigatableItem, public virtual QToolButton
    class MainMenuOption : public Button
    
    0 讨论(0)
  • 2021-02-09 07:34

    It requires a bit more code, but what I have done in the past is make one of them (your NavigatableItem in this case) a pure virtual class, i.e. interface. Instead of using the "signals" macro, make them pure virtual protected functions. Then multiply-inherit from your QObject-derived class as well as the interface, and implement the methods.

    I know it is somewhat controversial, but avoiding multiple implementation inheritance at all costs does solve a host of problems and confusion. The Google C++ Style Guidelines recommend this, and I think it is good advice.

    class NavigatableItemInterface
    {
        // Don't forget the virtual destructor!
        protected:
            virtual void deselected() = 0;
            virtual void selected() = 0;
            virtual void activated() = 0;
    };
    
    class Button : public NavigatableItemInterface, public QToolButton
    {
        Q_OBJECT
        ...
        signals:
            virtual void deselected();
            ...
    }
    
    0 讨论(0)
提交回复
热议问题