Ho una classe (MyClass
) che eredita gran parte delle sue funzionalità da un oggetto incorporato Qt (QGraphicsTextItem
). QGraphicsTextItem
eredita indirettamente da QObject
. MyClass
implementa anche un'interfaccia, MyInterface
.Utilizzo di segnali Qt e slot con ereditarietà multipla
class MyClass : public QGraphicsTextItem, public MyInterface
ho bisogno di essere in grado di utilizzare connect
e disconnect
su MyInterface*
. Ma sembra che connect
e disconnect
funzionino solo su istanze QObject*
. Poiché Qt non supporta l'ereditarietà multipla dalle classi derivate da QObject, non è possibile derivare MyInterface
da QObject
. (Né sarebbe comunque molto sensato per un'interfaccia.)
C'è un discussion of the problem online, ma IMO la soluzione proposta è abbastanza inutile nel caso comune (accedere a un oggetto tramite la sua interfaccia), perché non è possibile collegare i segnali e slot da MyInterface*
ma devono trasmetterlo al tipo derivato. Dal momento che MyClass
è una delle molte classi precedute da MyInterface
, questo richiederebbe istruzioni "casuali-se-quelle-cast-to-this-cast-to-this-else-if-that-cast-to-that" e vanificherebbe lo scopo dell'interfaccia.
C'è una buona soluzione a questa limitazione?
UPDATE: mi accorsi che se mi dynamic_cast
un MyInterface*
-QObject*
(perché so tutte le classi MyInterface
-derived anche ereditare eventualmente da QObject
, sembra funzionare Cioè:.
MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
Ma questo veramente sembra come se stessi chiedendo un comportamento non definito ....
Come e dove ha dichiarato MyInterfaceSignal? –
'MyInterfaceSignal' è dichiarato come metodo virtuale puro protetto * non-segnale * in' MyInterface', e quindi come un * segnale * nelle classi derivate. Pertanto, il compilatore assicura che le classi derivate abbiano il metodo, ma spetta all'implementatore contrassegnarlo come un segnale. È inutile, perché non sto * * * richiamando la tabella delle chiamate virtuali da 'MyInterface.MyInterfaceSignal', ma piuttosto facendo affidamento sul fatto che la macro SIGNAL è - alla fine della giornata - solo la risoluzione di un' char * 'nome del metodo. –