2009-09-28 18 views
6

Ho esaminato le domande correlate e non ho trovato nulla che riguardasse esattamente ciò di cui stavo parlando, quindi lasciatemi descrivere.In Qt, come si usano gli slot Q_OBJECT e i segnali con ereditarietà multipla?

Ho una classe, diciamo foo che deve avere i propri slot e segnali, ma deve anche ereditare da QXmlDefaultHandler (sembra piuttosto strano, ma ho riscontrato questa situazione quando provavo a usare QHttp per leggere un sito web direttamente in un QBuffer).

class foo: public QXmlDefaultHandler, public QObject 
{ 
    public: 
     foo(); 
     ~foo(); 

     Q_OBJECT 
    public slots: 
     void bar(); 
} 

Questo codice, se accompagnato da un cpp per collegare la barra a un segnale da qualche altra parte, non verrà compilato. Riceverai errori su alcuni membri di QObject che non sono membri di QXmlDefaultHandler. Inoltre, non è possibile spostare Q_OBJECT o si ottengono errori vtable per non implementare alcune cose (vai avanti! Prova!).

vedere la mia risposta per la (molto semplice) correzione. Mi divertirò a votarti come risposta accettata se penso che lo spieghi meglio di me.

modifica: per i veterinari C++ e Qt, si prega di inviare una risposta se è possibile spiegarlo meglio. Ho passato un po 'di tempo a cercare queste informazioni, quindi per favore aiuta qualcun altro se puoi fare meglio di me.

risposta

12

Il documentation for moc afferma che in caso di ereditarietà multipla, la classe che fornisce QObject dovrebbe comparire prima

Se si utilizza l'ereditarietà multipla, moc presuppone che il primo ereditato classe è una sottoclasse di QObject. Inoltre, assicurati che solo la prima classe ereditata sia un oggetto QObject.

// correct 
class SomeClass : public QObject, public OtherClass 
{ 
    ... 
}; 

eredità virtuale con QObject è non supportato.

2
class foo: public QObject, public QXmlDefaultHandler 
{ 
    public: 
     foo(); 
     ~foo(); 
    Q_OBJECT 
    public slots: 
     void bar(); 
} 

Semplice come sembra, se non si inserisce QObject prima nell'elenco di ereditarietà, questo compito è impossibile. È una limitazione nel sistema di meta oggetti di Qt. Se non lo fai, il compilatore proverà ad applicare alcuni membri di QObject come parte di QXmlDefaultHandler.

Problemi correlati