Pergunta

Eu olhei através das perguntas relacionadas e não consegui encontrar nada que abordasse exatamente o que eu estava falando, então deixe -me descrever.

Eu tenho uma aula, digamos Foo que precisa ter seus próprios slots e sinais, mas também precisa herdar do QXMlDoraFaultHandler (parece bastante estranho, mas encontrei essa situação ao tentar usar o QHTTP para ler um site diretamente em um QBuffer).

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

       Q_OBJECT
   public slots:
       void bar();
}

Este código, se acompanhado por um CPP para conectar a barra a um sinal em outro lugar, não compilará. Você receberá erros sobre alguns membros do QObject não serem membros do QXMlDDefaultHandler. Além disso, você não pode mover Q_Object, ou então você recebe erros vtable por não implementar algumas coisas (continue! Experimente!).

Por favor, veja minha resposta para a correção (muito simples). Vou entreter a votação de você como a resposta aceita se eu acho que você explica melhor do que eu.

EDIT: Para seus veterinários C ++ e QT, poste uma resposta se você puder explicar melhor. Passei bastante tempo procurando essas informações, então ajude outra pessoa se você puder fazer melhor do que eu.

Foi útil?

Solução

o Documentação para MOC afirma que, em casos de herança múltipla, a classe que fornece o QObject deve aparecer primeiro

Se você estiver usando a herança múltipla, o MOC assume que a primeira classe herdada é uma subclasse do QObject. Além disso, certifique -se de que apenas a primeira classe herdada é um QObject.

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

A herança virtual com QObject não é suportada.

Outras dicas

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

Por mais simples que pareça, se você não colocar o QObject em primeiro lugar na lista de herança, essa tarefa é impossível. É uma limitação no sistema de meta de meta do QT. Se você não fizer isso, o compilador tentará aplicar alguns membros do QObject como parte do qxmldefaulthandler.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top