Dans Qt, comment puis-je utiliser les emplacements Q_OBJECT et des signaux avec l'héritage multiple?

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

  •  18-09-2019
  •  | 
  •  

Question

Je regardais à travers les questions connexes et ne pouvait pas trouver quelque chose qui traite exactement ce que je parlais, alors laissez-moi vous décrire.

J'ai une classe, disons foo qui doit avoir ses propres machines à sous et des signaux, mais doit également hériter de QXmlDefaultHandler (sonne un peu bizarre, mais je rencontré cette situation en essayant d'utiliser QHttp pour lire un site Web directement dans un QBuffer).

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

       Q_OBJECT
   public slots:
       void bar();
}

Ce code, si elle est accompagnée d'un cpp pour relier la barre à un signal ailleurs, ne compilera pas. Vous obtiendrez des erreurs sur certains membres de QObject ne pas être membre de QXmlDefaultHandler. De plus, vous ne pouvez pas déplacer Q_OBJECT ou bien vous obtenez des erreurs vtable pour ne pas appliquer certaines choses (allez sur! Essayer!).

S'il vous plaît voir ma réponse pour la (très simple) fixer. Je vous divertir voter comme la réponse acceptée si je pense que vous l'expliquer mieux que moi.

edit: pour vous c ++ et Qt Vets, s'il vous plaît poster une réponse si vous pouvez l'expliquer mieux. J'ai passé un peu de temps à regarder cette info, donc s'il vous plaît aider quelqu'un d'autre si vous pouvez faire mieux que moi.

Était-ce utile?

La solution

Le pour moc indique que, dans les cas d'héritage multiple, la classe fournissant QObject doit apparaître en premier

  

Si vous utilisez l'héritage multiple,   moc suppose que le premier hérité   classe est une sous-classe de QObject. Aussi,   assurez-vous que seul le premier hérité   classe est un QObject.

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

L'héritage virtuel avec QObject est   pas pris en charge.

Autres conseils

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

Aussi simple que cela puisse paraître, si vous ne mettez pas QObject d'abord dans la liste d'héritage, cette tâche est impossible. Il est une limitation dans le système de méta-objet de Qt. Si vous ne le faites pas, le compilateur va essayer d'appliquer certains membres de QObject dans le cadre de QXmlDefaultHandler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top