No QT, como uso slots e sinais de Q_Object com herança múltipla?
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.
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.