In Qt, come faccio a usare gli slot Q_OBJECT e segnali con l'ereditarietà multipla?

StackOverflow https://stackoverflow.com/questions/1489238

  •  18-09-2019
  •  | 
  •  

Domanda

ho guardato attraverso le questioni connesse e non ho trovato nulla che affronta esattamente quello che stavo parlando, quindi cerchiamo di descrivere.

Ho una classe, diciamo foo che ha bisogno di avere i propri slot e segnali, ma anche bisogno di ereditare da QXmlDefaultHandler (suona piuttosto strano, ma ho incontrato questa situazione quando si cerca di utilizzare 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 accompagnati da un cpp per collegare bar per un segnale da qualche altra parte, non sarà la compilazione. Otterrete errori su alcuni membri del QObject non essere un membro di QXmlDefaultHandler. Inoltre, non è possibile spostare Q_OBJECT altrimenti ottenere gli errori vtable per la mancata attuazione alcune cose (go on! Provatelo!).

Si prega di vedere la mia risposta per il (molto semplice) risolvere. Io vi intratterrà il voto come la risposta accettata se penso spieghi meglio di me.

modifica: per voi C ++ e Qt veterinari, si prega di inviare una risposta se si può spiegare meglio. Ho passato un bel po 'di tempo a cercare queste informazioni, così si prega di aiutare qualcun altro se si può fare meglio di me.

È stato utile?

Soluzione

Il href="http://doc.trolltech.com/4.5/moc.html#multiple-inheritance-requires-qobject-to-be-first" per 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. Anche,   essere sicuri che solo il primo ha ereditato   classe è un QObject.

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

eredità virtuale con QObject è   non supportato.

Altri suggerimenti

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

Per quanto semplice come sembra, se non metti QObject primo posto nella lista eredità, questo compito è impossibile. Si tratta di una limitazione nel sistema di oggetti meta di Qt. Se non si esegue questa operazione, il compilatore cercherà di applicare alcuni membri del QObject come parte di QXmlDefaultHandler.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top