Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QObject Multiple Inheritance

I am trying to use mix in classes for C++/Qt to provide a whole bunch of widgets with a common interface. The interface is defined in such as way so that if it is defined as the base class for other widget classes, then the widget themselves will have those signals:

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 } 

Looking at the class hierarchy the problem becomes apparent, I have stumbled on to the dreaded diamond in multiple inheritance, where the Widget1 inherits from QWidget and SignalInterface, and both which inherit from QObject. Will this cause any issues?

We know that this problem can be easily solved if the QObject class is pure virtual (which is not the case).

A possible solution would be:

class Interface: public QWidget { Q_OBJECT  signals: void IconChanged(QIcon); void titleChanged(QString); }  class Widget1: public Interface {  } 

The issue here is that I already have lot of code that inherit from QWidget, and its painful to hack that in. Is there another way?

like image 728
Anonymous Avatar asked Dec 20 '11 16:12

Anonymous


People also ask

What is a QObject?

QObject is the heart of the Qt Object Model. The central feature in this model is a very powerful mechanism for seamless object communication called signals and slots. You can connect a signal to a slot with connect() and destroy the connection with disconnect().

Whats the base class of most Qt objects?

The QObject class is the base class of all Qt objects. QObject is the heart of the Qt object model providing support for signals, slots, and the meta object system.


1 Answers

Unfortunately inheriting QObject twice will cause problems in moc.

From http://qt-project.org:

If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.

I would suggest using something more like the delegate pattern, or recreate with a HasA not a IsA relationship.

like image 73
szatmary Avatar answered Sep 23 '22 21:09

szatmary