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 :

Slot et signal pour afficher une croix au clic d'une souris


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut Slot et signal pour afficher une croix au clic d'une souris
    Bonjour à tous!
    Je suis débutant en QT4 et je continue mon apprentissage pas à pas.
    Je suis tombé sur un nouvel os : je cherche à afficher une croix lors du clic de la souris sur une fenêtre. J'ai bien lu le tutorial du zéro concernant l'utilisation des signals/slots et j'ai cherché à l'adapter pour parvenir à mes fins. Voici le code:

    main.cpp
    #include <QApplication>
    #include "FenPrincipale.h"

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    FenPrincipale fenetre;
    fenetre.show();
    return app.exec();
    }
    FenPrincipale.h
    #ifndef HEADER_FENPRINCIPALE
    #define HEADER_FENPRINCIPALE

    #include <QtGui>
    #include <QLabel>
    #include <QMouseEvent>


    class FenPrincipale : public QMainWindow
    {
    Q_OBJECT

    public:
    FenPrincipale();

    public slots:
    void croix(int x, int y);

    signals:
    void monSignal(int x, int y);

    void mousePressEvent(QMouseEvent* event)
    {
    int x = event->x();
    int y = event->y();
    emit monSignal(x,y);
    }
    };
    #endif
    FenPrincipale.cpp
    #include "FenPrincipale.h"

    FenPrincipale::FenPrincipale()
    {
    QMenu *menuFichier = menuBar()->addMenu("&Fichier");
    QAction *actionQuitter = new QAction("&Quitter", this);
    menuFichier->addAction(actionQuitter);

    QObject::connect(this, SIGNAL(monSignal(int x, int y)), this, SLOT(croix(int x, int y)));
    }


    void FenPrincipale::croix(int x, int y)
    {
    QPainter painter(this);
    painter.setPen(Qt::black);
    painter.drawLine(x-1, y, x+1, y);
    painter.drawLine(x, y-1, x, y+1);
    }
    Le problème, c'est que le compilateur me dit que la ligne
    emit monSignal(x,y);
    de FenPrincipale.h n'est pas une déclaration de signal ("Not a signal declaration"). Voyez-vous pourquoi?
    Merci d'avance.

  2. #2
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    tout simplment parce que tu essais de declarer le
    void mousePressEvent(QMouseEvent* event) en tand que signal alors que c'est une method !

    de plus qu'esce que du code vient faire dans ton .h ???

    .h : h = header =>>> declaration de prototype ( de fonction et de classe ) donc aucun code !!
    pensez au

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    tout simplment parce que tu essais de declarer le
    void mousePressEvent(QMouseEvent* event) en tand que signal alors que c'est une method !
    -> tu as raison, je ne pensais pas qu'une fois "slot" écrit dans le code toutes les fonctions suivantes étaient considérées comme des slots...

    J'ai enlevé le code du .h, c'est effectivement sale et ce n'est pas l'endroit pour.

    Pour le reste, je crois avoir repéré une faille dans mon code. Je pense que mon "connect" est correct (j'ai testé avec la fonction quit() de qapp) et que le clic de la souris lance bien la fonction croix(int, int). Par contre, rien ne s'affiche. Faut-il rafraîchir la fenêtre ou quelque chose dans le genre ?
    Je mets le code corrigé pour mémoire.

    main.cpp
    #include <QApplication>
    #include "FenPrincipale.h"

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    FenPrincipale fenetre;
    fenetre.show();
    return app.exec();
    }
    FenPrincipale.h
    #ifndef HEADER_FENPRINCIPALE
    #define HEADER_FENPRINCIPALE
    #include <QtGui>
    #include <QLabel>
    #include <QMouseEvent>

    class FenPrincipale : public QMainWindow
    {
    Q_OBJECT

    public:
    FenPrincipale();

    void mousePressEvent(QMouseEvent* event);

    public slots:
    void croix(int x, int y);

    signals:
    void monSignal(int x, int y);
    };
    #endif
    FenPrincipale.cpp
    #include "FenPrincipale.h"

    FenPrincipale::FenPrincipale()
    {
    setFixedSize(400, 200);
    QMenu *menuFichier = menuBar()->addMenu("&Fichier");
    QAction *actionQuitter = new QAction("&Quitter", this);
    menuFichier->addAction(actionQuitter);

    QObject::connect(this, SIGNAL(monSignal(int, int)), this, SLOT(croix(int, int)));
    }


    void FenPrincipale::croix(int x, int y)
    {
    QPainter painter(this);
    painter.setPen(Qt::black);
    painter.drawLine(x-10, y, x+10, y);
    painter.drawLine(x, y-10, x, y+10);
    }

    void FenPrincipale::mousePressEvent(QMouseEvent* event)
    {
    int x = event->x();
    int y = event->y();
    emit monSignal(x,y);
    }

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Comme le dit la doc
    http://qt.developpez.com/doc/4.4/qpainter/#details
    Citation Envoyé par doc Qt
    Warning: When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by paintEvent(); that is unless the Qt::WA_PaintOutsidePaintEvent widget attribute is set. On Mac OS X and Windows, you can only paint in a paintEvent() function regardless of this attribute's setting.
    Tu ne peut utiliser QPainter que dans une redefinition de la fonction paint event.
    Si tu regarde dans la FAQ, tu trouve
    http://qt.developpez.com/faq/?page=q...er_dans_widget

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    J'ai réussi à obtenir le résultat que je voulais grâce à vos indications. J'ai redéfini la fonction paint event pour pouvoir dessiner. Pour faire passer les paramètres de position de la croix, j'ai ajouté un attribut dans ma classe et la fonction paint event lit les coordonnées directement là.
    Je vous remercie tous les deux pour votre aide

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/02/2014, 10h12
  2. Réponses: 1
    Dernier message: 07/02/2013, 15h10
  3. [AC-97] Requette pour afficher un record en fonction d'une table de liaisons.
    Par Jazz_ dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 16/08/2010, 13h23
  4. Réponses: 5
    Dernier message: 10/01/2008, 08h47
  5. Réponses: 2
    Dernier message: 04/06/2006, 18h53

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