Como tomar três rasteiras pra fazer um sinal/slot no Qt Designer
Bom, eu não sabia nada de Qt. E não tinha lido nenhum livro. Mas ao ler tutorial Signal and Slots da documentação, me senti confiante pra usá-lo no meu primeiro projeto. Só quero contar alguns cuidados adicionais caso pretenda fazer o mesmo mas usando tipos personalizados para os seus sinais e esteja no meu nível de (des)conhecimento do Qt.
- A primeira rasteira está quase toda escrita no documento citado. Você precisa avisar que sua classe é especial, isto é, tem lógica de sinais e slots. Isto é feito através da macro Q_OBJECT, que deve ser colocada dentro da sua classe e através da herança de QObject. O que não está muito claro pra quem não tem experiência com Qt ou QtDesign é que você precisa garantir que seu .h está listado dentro do arquivo de projeto (com .pro no final) na diretiva HEADERS e que é necessária uma chamada explícita de “run qmake” no menu para processar as palavras chaves adicionais do Qt (eu imaginei que o QtDesigner fazia isto pra mim, “Santa ingenuidade, Batman !”). Eu fiquei na dúvida se é necessário um “rebuild all” depois, fiquei com a impressão que sim, mas não sei afirmar ainda com certeza. Comentários para os leigos como eu são bem vindos.
- A segunda rasteira foi em achar que eu poderia usar um método com o formato “on_nome_do_metodo” para os meus slots, como os elementos da interface gráfica fazem. Segundo o pessoal do fórum QtCentre, não pode. Bom, com on_ não compilava.
- A terceira rasteira eu tomei ao usar tipos personalizados nos sinais. Ok, isto nem é recomendado pois diminui o reuso do sinal. Mas eu precisava que fosse assim. Desta vez, a mensagem foi mais clara para um iniciante, algo como “Make sure <sua classe> is registered using qRegisterMetaType“. O mecanismo de sinais/slot é sofisticado e tem checagem dinâmica de tipos e fila, mas os tipos precisam ter sido registrados antes. No meu caso, era uma estrutura e era necessário a chamada de Q_DECLARE_METATYPE(nome_da_estrutura) dentro do .h e depois, antes de qualquer uso do sinal, qRegisterMetaType<nome_da_estrutura>(“nome desejado para o tipo”) dentro de algum .cpp.
Finalmente o connect funcionou e o sinal foi corretamente emitido. Não se esqueça que um signal é apenas declarado no .h, não crie o método no .cpp. Isto está na documentação e, obviamente, eu só fui ver na segunda leitura. Logo, não foi uma rasteira, foi mais uma “bobeira”, das várias cometidas.
E não esqueça também dos .h relacionados, como #include <QMetaType> para as macros de tipo personalizado e #include <QObject> para os sinais e slots (não, isto eu não esqueci!).
No mais, continuo adorando o Qt/QtDesigner. Tenho gostado muito como os projetistas criaram os objetos, seus métodos e formas de uso. Até esqueci que várias palavras chaves foram adicionadas ao C++, como signal, slot, foreach, emit .. A documentação é boa e ajuda bem (olhe apenas a da versão que estiver usando, tomei outras rasteiras por achar que era tudo igual).
Além disso, como meus objetivos com Qt saem do PC e vão para o S60 e, em breve, para o PyQt for S60, não tem nada melhor pra aprender agora !








acassis 7:10 pm em Maio 22, 2009 Link Permanente
Que complicacao eim?
Nada como GTK ou FLTK!
Um abraco,
Alan
jedizone 7:59 pm em Maio 22, 2009 Link Permanente
Cara, no fundo é bem legal ! Avaliação bem positiva !