Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Programmation.c++ : QT4 et slots perso

Posté par omnikron () le 10 janvier 2006
Bonjour,



Je cherchais un toolkit graphique pour developper des IHM... Apres quelques essais et test, j'ai finalement opté pour QT en C++. J'ai essayé python avec QT3 mais je voulais faire du QT4 directement, or au moment ou j'ai commencé mes tests pyQT n'était dispo que pour QT3. Bref.... nous allons discuter des slots perso.



Tout d'abord pour vous faire une idée, vous pourrez constater ici ce que donne mon interface pour l'instant (ce n'est pas fini hein :p).

http://julthomas.free.fr/plop.png



En gros, j'ai un QGridLayout qui divise ma fenetre en 2 (gauche et droite). Chaque partie (gauche et droite) est sur un QVBoxLayout. A gauche haut, j'ai un SearchWidget perso. A gauche bas, j'ai un QTableWidget. A droite au j'ai un autre widget perso que j'ai appellé InfosWidget. Et a droite bas j'ai pour l'instant un simple bouton histoire de mettre qquechose.



Mon test de slot perso se situe au niveau du InfosWidget. Si on regarde le screenshot, on voit un QLineEdit et juste a côté un QSlider. Je cherche à faire en sorte que bouger le QSlider mette à jour le QLineEdit. Facile :) Oui mais... Voici ma classe InfosWidget :





#ifndef __INFOSWIDGET_H__

#define __INFOSWIDGET_H__



#include <QtGui>



class InfosWidget : public QWidget

{

Q_OBJECT



private:

QGridLayout *mainLay;

QLabel *titleLab;

QLabel *commentLab;

QLabel *scoreLab;

QLineEdit *scoreValEdit;

QLineEdit *titleEdit;

QTextEdit *commentEdit;

QSlider *scoreSlide;

QPushButton *updateBut;



public:

InfosWidget();

~InfosWidget();



public slots:

void updateScoreValEdit(int val);

};



#endif /* __INFOSWIDGET_H__ */





Voici comment est connecté mon slot dans InfosWidget.cpp :





connect(scoreSlide, SIGNAL(valueChanged(int)), this, SLOT(updateScoreValEdit(int)));





Et voici le code du slot updateScoreValEdit(int) :





void InfosWidget::updateScoreValEdit(int val)

{

QString str;



str.setNum(val);

cout << str.toStdString() << endl;

//scoreValEdit->setText(str);

}





Tel quel, lorsque je bouge mon slide, je vois bien s'afficher la valeur dans ma console. Lorsque je décommente la ligne qui met à jour le QLineEdit, paf segfault au premier mouvement du slide. Au début j'avais essayé avec un QLabel au lieu d'un QLineEdit, pareil, même chose...



Je ne maîtrise pas les autotools, je n'utilise pas KDeveloppe. Je fais tout ca sous Emacs... Le but est faire une applis de gestion de mes divx, qui scanne les fichiers médias de mes disques durs et met le tout dans une base SQLite. J'ai déja developpé toute cette partie, et j'en suis à l'interface.



Pour compiler l'interface, j'ai donc fait mon Makefile perso en regardant les commandes que lançait qmake-qt4 car je voulais me passait des outils trolltech. Or, après avoir lu quelques docs, je m'apperçois que QT utilise un truc dont je doit absolument me servir pour faire des slots perso : moc. Je n'aime pas beaucoup ca mais bon, du coup pour l'instant je compile mon interface avec :





qmake-qt4 -project

qmake

make





A cause de ce moc, j'ai dû rajouter :

#include <QtGui>

dans mon .hpp, ce que j'ai trouvé très crado. Mais bon, apparement pas le choix.



Bref, en utilisant les outils QT (qmake, moc), en ayant inclus les header des objets QT et ayant mis la directive Q_OBJECT dans mon .hpp, tout devrait être réunit pour me slot perso fonctionne !! Mais non.



Ma question est donc, quelqu'un pourrait-il me donner une piste pour éviter ce segfault ? De plus, suis-je obligé d'utiliser les outils QT, ce moc me donne des boutons :) J'aime bien me compliquer et lancer à la main mes lignes de commandes appelant g++.



A ce que je sache, les projets utilisant QT que j'ai déjà pu compiler n'utilise pas qmake. Un ./configure && make fonctionne très bien et je suppose que le make n'appelle pas qmake.



Merci d'avance,

Julien.

> Lire le message (12 commentaires, moyenne: 1,5).  

Vous avez demandé le commentaire #669585.

Emacs

Posté par neil () le 10/01/2006 à 20:39. (lien). Évalué à 0.

Je ne maîtrise pas les autotools, je n'utilise pas KDeveloppe. Je fais tout ca sous Emacs...

Déjà un bon point :-)

paf segfault au premier mouvement du slide

Rajoute gdb à ta boîte à outil et débuggue!
Tu devras probablement rajouter des -ggdb et autres "debug" dans ta config.

ce moc me donne des boutons

Apparamment ils utilisent pas les templates, enfin ils utilisent leur propre macro-ifieur
:-(

  • [^]Re: Emacs

    Posté par neil () le 11/01/2006 à 09:27. (lien). Évalué à 2.

    Bah même pas besoin de gdb (mais absolument indispensable à tout codeur).

    Ton en-tête est cool, tu définit bien le bidule dans InfosWidget.h :

    QLineEdit *scoreValEdit;


    Mais après dans InfosWidget.cpp (pourquoi pas .cc ???), tu redéfinit une nouvelle variablle InfosWidget, tu aurais du écrire :
    scoreValEdit = new QLineEdit("00");

    plutôt que
    QLineEdit *scoreValEdit = new QLineEdit("00");
    .

    --
    Emacs ça déchire (C-x 4-a pour rajouter une entréee dans le ChangeLog)

    • [^]Re: Emacs

      Posté par omnikron () le 11/01/2006 à 10:27. (lien). Évalué à 1.

      Ah oui effectivement.... C'est le copié/collé apres avoir ait le .hpp ça :) Tu crois que le segfault sur le slot pourrait venir de ça ? Je testerai ce soir, j'ai partiel dans 2 heure et je doit réviser encore :)

      Sinon .cpp me parait plus "standard" que .cc, mais à vrai dire j'en sais strictement rien. Pareil pour .hpp au lieu de .hh... J'ai regardé dans des sources de projets et il me semble que c'était les extentions qui revenaient.

      Mais effectivement les divers avis m'interessent.