IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Signal éxistant ou faut il le créer ?


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut Signal éxistant ou faut il le créer ?
    Bonsoir à tous.

    Je reviens faire mumuse avec Qt que j'avais un peu lâché.

    Pour le moment je ne fais strictement rien de sérieux ; je préfère correctement assimiler le fonctionnement de la bête avant d'attaquer la création d'un GUI pour un de mes programmes.

    Mon "projet" actuel se compose de 6 boutons et 3 labels

    il y a 2 boutons pour faire varier la largeur de la fenêtre ; 2 pour la hauteur et 2 pour la transparence.

    Les labels servent à me donner les valeurs


    Le tout connecter à des slots qui fonctionne parfaitement.


    Jusque la ca va, n'ayant pas fixé les dimensions de ma fenêtre, si une personne modifie la taille de la fenêtre via les "coins" mes informations sont donc fausse ( à chaque pression sur un bouton, il y a un MAJ du label correspondant.).

    J'ai donc créer un slot pour faire les MAJ de mes labels or je n'ai pas trouvé de signal correspondant à un changement de dimension de la fenêtre.

    J'ai bien lu quelque chose s'en approchant mais je n'ai pas l'impression que ce soit ce que je cherche.

    Pourriez vous m'aiguiller ?

    Merci d'avance.

    Bonne soirée

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Il n'existe pas de signal au sens Qt émis lors du resize() et que tu pourrais connecter à un slot.

    Par contre, lorsque un resize est fait sur un QWidget, c'est la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void QWidget::resizeEvent(QResizeEvent* event) [virtual protected]
    qui est appelée(doc ici). Tu peux donc la redéfinir dans une classe héritant de QWidget, et ainsi faire ce que tu veux à l'intérieur.

    ATTENTION : Tous les changements de taille vont entraîner un appel à cette fonction (même les tiens). Attention donc aux appels récursifs !

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    J'ai comprie la théorie, mais la pratique c'est pas ca :/

    Il faut donc que je recrée deux fichier ( un .h et un .cpp )

    Dans mon header je déclare ma classe grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MajResize  : public QWidget
    avec deux méthode public : le contructeur MajResize() et la méthode void resizeEvent() .

    Ensuite dans mon cpp je défini ma classe grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MajResize::MajResize() : QWidget()
    C'est bien ca ou je me plante ?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    C'est bien ça oui.

    Voila un petit code d'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <QtGui>
    #include <QtCore>
     
    class MyTest : public QWidget
    {
    public:
    	MyTest ( QWidget * parent = 0, Qt::WindowFlags f = 0 ) : QWidget  (parent,f)
    	{label=new QLabel("Changer ma taille", this);}
    protected:
     
    	void resizeEvent(QResizeEvent *event)
    	{
    		QString sizeChange;
     
    		if (event->size().width()>event->oldSize().width())
    			sizeChange+="Ma largeur a augmenté";
    		else
    			sizeChange+="Ma largeur a diminué";
     
     
    		if (event->size().height()>event->oldSize().height())
    			sizeChange+=" et ma hauteur a augmenté.";
    		else
    			sizeChange+=" et ma hauteur a diminué.";
     
    		label->setText(sizeChange);
     
    		event->accept();
    	}
     
    private :
    	QLabel *label;
    };
     
     
     
    int main(int argc, char** argv)
    {
    	QApplication app(argc, argv);
    	MyTest test;
    	test.show();
    	return app.exec();
    }
    Ca marche pas parfaitement parce que la taille égale n'est pas gérée, mais c'est un exemple.

    Tu peux en effet faire un .h et un .cpp. C'est plus propre, je ne peux que te le conseiller.
    "Faites ce que je dis pas ce que je fais"^^.

    Bonne chance

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Je vous remercie beaucoup de m'avoir expliqué cependant j'ai une question j'ai lu que vous aviez mis la méthode resizeEvent en "protected" je peux donc appeller cette méthode depuis une classe fille via l'héritage ( c'est ce que j'ai cru comprendre de mon cour ) ?

    Je m'y remet des ce soir !

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    vous aviez mis la méthode resizeEvent en "protected" je peux donc appeller cette méthode depuis une classe fille via l'héritage ( c'est ce que j'ai cru comprendre de mon cour ) ?
    Oui, en effet. Je l'ai mise en protected car elle est deja en protected dans QWidget. Et il me semble inutile de la rendre publique, puisque finalement elle n'est pas sensée être appelée directement dans ton code.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Pourriez vous m'expliquer comment intégré ca dans un .h et .cpp car je n'y arrive pas.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    MyTest.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <QtGui>
    #include <QtCore>
     
    class MyTest : public QWidget
    {
    public:
    	MyTest ( QWidget * parent = 0, Qt::WindowFlags f = 0 );
    protected:
     
    	void resizeEvent(QResizeEvent *event);
     
    private :
    	QLabel *label;
    };
    ----------------------------------
    MyTest.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <QtGui>
    #include <QtCore>
     
     
    MyTest::MyTest  ( QWidget * parent , Qt::WindowFlags f) : QWidget(parent,f)
    {
    label=new QLabel("Changer ma taille", this);
    }
     
     
    void MyTest::resizeEvent(QResizeEvent *event)
    	{
    		QString sizeChange;
     
    		if (event->size().width()>event->oldSize().width())
    			sizeChange+="Ma largeur a augmenté";
    		else
    			sizeChange+="Ma largeur a diminué";
     
     
    		if (event->size().height()>event->oldSize().height())
    			sizeChange+=" et ma hauteur a augmenté.";
    		else
    			sizeChange+=" et ma hauteur a diminué.";
     
    		label->setText(sizeChange);
     
    		event->accept();
    }
    ----------------------------------
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QtGui>
    #include <QtCore>
    #include "MyTest.h"
     
     
    int main(int argc, char** argv)
    {
    	QApplication app(argc, argv);
    	MyTest test;
    	test.show();
    	return app.exec();
    }
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Merci beaucoup !

    Grâce à vous cela fonctionne, et je pense avoir compris le code, cependant il y a une question que me turlupine

    C'est a propos de D'aprés ce que j'ai lu de la doc, quand resizeEvent() est appelée le Widget a déjà ses nouvelles dimensions donc a quoi sert cette ligne ? J'imagine que si il y a un accept() il doit exister son contraire ?

    D'ailleurs en passant cette ligne en commentaire, le code fonctionne toujours aussi bien, ce qui me parait logique au vu de ce qui est marqué dans la doc.

    Pourriez vous m'expliquer la nécessité de cette ligne ne connaissant pratiquement rien à Qt je préfére avoir l'avis d'une personne maitrisant le sujet


    Merci encore pour vous explications détaillés qui m'ont permis en plus de réussir ce petit projet, d'apprendre un peu plus sur Qt.

    Bonne soirée

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    D'aprés ce que j'ai lu de la doc, quand resizeEvent() est appelée le Widget a déjà ses nouvelles dimensions donc a quoi sert cette ligne ? J'imagine que si il y a un accept() il doit exister son contraire ?
    Enfin quelqu'un qui lit la doc, ça fait plaisir !

    Alors, en effet, lorsque resizeEvent() est appelé, la nouvelle taille est déjà calculée. Cependant, comme il est également écrit, il n'est pas encore redessiné. Donc des modifications sont encore possibles.

    Concernant le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    event->accept(); // ou son contraire event->ignore();
    L'exemple n'est pas très parlant (car il s'agit d'un QResizeEvent). accept() ou ignore() permet dans la plupart des cas de traiter ou non l'évènement (souvent dans des cas de clic de souris, de fermeture de fenêtre, ou autres entrées utilisateurs). De plus, comme il est écrit dans la doc de QEvent, les events ignorés peuvent être propagées aux widgets parents (ca depend du type de l'event) et ainsi être gérées par l'eventHandler du widget parent. (Ca ressemble un peu à la propagation des exceptions en java, qui remontent les blocs d'appels jusqu' à être gérées).

    Voilà pour la théorie. Comme je l'ai dit, dans le cas du QResizeEvent, c'est pas très parlant, mais tes développements futurs te ramèneront surement à cette notion.

    Bon courage,

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    Je me permet une petite question qui n'a pas trop de rapport avec le sujet initial mais j'aimerai savoir comment faire une boucle qui ne bloque pas mon processus : j'ai fais un programme qui me donne mon uptime en console, ca fonctionne bien mais comment diree euhhh c'est moche :/

    Hier soir je me suis dis qu'il me serait possible de faire un petit quelque chose de plus beau

    J'ai donc créer un slot que j'avais relier à un bouton ca fonctionnait nickel or, j'aimerai maintenant faire une boucle toute les seconde qui appellerai ma fonction .

    EDIT : J'ai trouvé il suffit d'utiliser un QTimer c'est vraiment impressionnant ce dont est capable Qt !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Que faut-il pour créer un serveur web ?
    Par totodu038 dans le forum Hébergement
    Réponses: 2
    Dernier message: 15/03/2010, 13h53
  2. où faut il créer session
    Par hoor3in dans le forum Struts 1
    Réponses: 3
    Dernier message: 03/08/2007, 15h55
  3. Réponses: 8
    Dernier message: 27/07/2007, 14h08
  4. Créer un site : Faut-il faire des declarations ?
    Par jejesochalion dans le forum Droit
    Réponses: 13
    Dernier message: 05/09/2006, 22h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo