QT & Dev-C++ : Problème avec moc - C++ - Programmation
Marsh Posté le 28-03-2006 à 17:06:26
disons que "à la main", il faut appeler moc sur le fichier .h qui contient ta classe pour générer un nouveau fichier C++
exemple : t'as ton fichier fenetreprincipale.h et fenetreprincipale.cpp
tu fais :
moc fenetreprincipale.h -o moc_fenetreprincipale.cpp |
puis tu compile :
g++ moc_fenetreprincipale.cpp fenetreprincipale.cpp -o fenetreprincipale |
(avec toutes les options nécessaires à GCC pour linker avec QT)
Sinon, mettre la ligne "Q_OBJECT" dans une classe n'est utile que si tu a déclaré des slots ou des signaux dedans.
Pour les explications, je pense que ça ne doit pas être compliqué d'adapter celles de QT3 à QT4.
(ne me demande pas, je ne code que sous Linux, jamais sous Windows)
Marsh Posté le 28-03-2006 à 17:37:38
He bien je te remercie parce que ça marche désormais !
J'ai suivi tes conseils et surtout je me suis désormais fait un .bat avec les g++ pour que je puisse compiler un peu comme je le veux.
Désormais mes slots fonctionnent, c'est agréable... j'espère que sous Linux j'arriverai aussi à faire fonctionner Qt assez rapidement...
Marsh Posté le 28-03-2006 à 23:17:48
Salut,
Si tu veux éviter la gestion laborieuse des batches, je te conseillerais de jeter un oeil à qmake et sa doc. Tu crée un fichier .pro (que ce soit à la main ou par qmake), tu le balances à qmake, et il te génère un makefile qui appelles après soit le makefile.debug, soit le makefile.release selon la config utilisé dans ton .pro
Ca fait longtemps que je n'ai pas utiliser dev-c++, mais tu dois pouvoir te créer un outil qui t'appelleras qmake selon ton projet, et préciser que tu veux utiliser tel makefile (celui généré par qmake).
Marsh Posté le 29-03-2006 à 00:32:07
En gros MOC te permet de défnir des signaux et des slots dans tes classes où se trouve Q_OBJECT.
Moc ajoute aussi des champs et des fonctions à tes classes: nom de la classe, nom des classes héritées, ...
Pour celà tu doit passer ton .H à moc, il crée alors un fichier moc_*.cpp que tu compile avec le reste.
Si tu mets Q_OBJECT dans une classe sans la moc-quer tu obtient des erreurs à l édition des liens.
C est pas du 100% objet tout ça, surtout que signal/slot sont faisables avec des templates. Mais dans les premières versions de Qt les compilos étaient pas aussi évolués qu aujourd hui.
Marsh Posté le 29-03-2006 à 11:47:03
nargy, j'ai déjà expliqué...
Qt, c'est plus de la prog orientée évènement que de la prog objet
Marsh Posté le 28-03-2006 à 14:12:39
J'ai appris que pour utiliser QT, il faut se servir de "moc" (Meta Object Compiler).
J'utilise Dev-C++ (4.9.9.2) et Qt (4.1.1)... mais impossible de faire comprendre à Dev-C++ qu'il faut qu'il prenne en compte le moc.exe (ou qqchose dans le genre) pour compiler et faire l'édition de lien.
J'ai cherché sur Google car le problème est assez connu il parait, mais j'ai eu beau essayer de faire tout sur ce quoi je suis tombé... ben rien n'y fait. D'autant plus que la plupart du temps ce sont des explications pour QT3 ou des Dev-C++ antérieurs
Alors voilà, si quelqu'un a l'habitude d'utiliser QT, merci de m'aider svp
Si vous voulez + d'informations ben je peux rajouter que l'erreur est la suivante :
main.o(.text+0x132):main.cpp: undefined reference to `vtable for FenetrePrincipale'
FenetrePrincipale.o(.text+0x7d):FenetrePrincipale.cpp: undefined reference to `vtable for FenetrePrincipale'
Et ca vient de cette ligne (le Q_OBJECT) :
Pour l'instant je sais seulement que ca vient de moc, mais malgré ce que j'ai lu (en anglais en plus la plupart du temps), je comprends toujours pas l'utilité de cette chose et comment l'intégrer à dev-c++...
Si l'un de vous a un peu de temps... merci par avance...