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

Discussion :

QLCDNumber et incrémentation sur clic

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Buldor
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Par défaut QLCDNumber et incrémentation sur clic
    Bonjour à tous,

    je débute avec Qt. Je voudrais avoir un QLCDNumber qui s'incrémente lorsque je clique dessus. Malheureusement, il n'y a pas de slot "clicked()" dans QLCDNumber. En fouillant à droite à gauche, je suis tomber toujours sur la même solution: surcharger QWidget::mouseReleaseButton(event* e).
    Cependant je n'y parviens pas.

    Comment dois-je procéder ?
    Dois je créer un QWidget perso ?

    J'ai bien essayé en créant une nouvelle classe héritant de QWidget et ayant un attribut pointeur sur QLCDNumber puis en surchargeant mouseReleaseButton mais il ne se passe rien lorsque je clique sur le QLCDNumber...

    Un exemple serait le bien venu.


    voici ce que j'ai tenté

    mywidget.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
    15
     
    #include "QWidget"
    #include "QLCDNumber"
     
     
    class MyQWidget : public QWidget
    {
     Q_OBJECT
    public:
      MyQWidget(QWidget* parent=0);
    protected:
      void mouseReleaseEvent(QMouseEvent*);
    public:
      QLCDNumber* lcd;
    };
    mywidget.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
     
    #include "mywidget.h"
    #include "QDebug"
     
     
    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        lcd = new QLCDNumber(parent);
    }
     
    void MyWidget::mouseReleaseEvent(QMouseEvent *e)
    {
        qDebug("je suis bien dans le click");
        if (e->button() == Qt::LeftButton)
            lcd->display(lcd->intValue()+1);
    }

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    QLCDNumber descend de QWidget. QWidget permet de surcharger des méthodes déclenchées par des événements (clavier/souris/toucher...) pour définir la réaction à cet événement.
    Pour certains QWidget pour lesquels c'est utile, par exemple les boutons (QPushButton, QToolButton...), il est pratique de définir des signaux comme clicked(), pressed()... qu'on peut utiliser sans avoir à surcharger de méthode d'événements, c'est pourquoi Qt les a faits. Mais pour un QLCDNumber, de base il ne sert pas à cliquer dessus, donc c'est normal que rien ne soit prévu.

    C'est pourquoi tu dois créer ta propre classe, qui hérite de QLCDNumber et redéfinit le comportement déclenché par les événements.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MyLCDNumber::MyLCDNumber(QWidget *parent)
        : QLCDNumber(parent)
    {
    }
     
    void MyLCDNumber::mouseReleaseEvent(QMouseEvent *e)
    {
        qDebug("je suis bien dans le click");
        if (e->button() == Qt::LeftButton)
            display(intValue()+1);
    }
    Il existe une autre manière de traiter les événements, qui évite de créer une classe : le filtrage sur ses enfants. Voir ici : http://qt.developpez.com/faq/?page=q...nts-manipulate

  3. #3
    Membre averti Avatar de Buldor
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Par défaut
    Pourquoi faire simple quand on peut faire compliqué...
    Merci Troudhil, ca parait évident maintenant.

    Je n'ai pas compris la technique du filtre. Je regarderai plus en détail demain.

  4. #4
    Membre averti Avatar de Buldor
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Par défaut
    J'ai de nouveau un soucis que je ne parviens pas à comprendre. le code ci dessous fonctionne


    mainwindow.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
    #include "mainwindow.h"
    #include "QDebug"
     
    class MyLCD: public QLCDNumber {
    public:
        MyLCD(QWidget* parent=0) {}
     
    protected:
        void mouseReleaseEvent(QMouseEvent *e) {
            qDebug("je suis bien dans le click");
            if (e->button() == Qt::LeftButton)
                display(intValue()+1);
         }
    };
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        MyLCD* lcd = new MyLCD(this);
        lcd->show();
     
        ui->setupUi(this);
    }
    cependant le "lcd" n'apparait pas dans la fenêtre principale mais dans une fenêtre popup qui contient uniquement le lcd (en fait, le lcd est détaché de la fenêtre principale).
    lorsque je modifie le constructeur en rajoutant l'initialisation suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyLCD(QWidget* parent=0) : LCDNumber(parent) {}
    j'ai bien mon "lcd" dans la fenêtre mais plus rien ne se passe lorsque je clique sur lui...

    Que se passe t-il ?

  5. #5
    Membre averti Avatar de Buldor
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Par défaut
    ... j'ai trouvé d'où venait le problème.
    ui->setupUi(this); doit être appelé avant la déclaration de lcd.

    ce qui nous donne pour ceux qui serait aussi étourdi que moi:
    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
    #include "mainwindow.h"
    #include "QDebug"
     
    class MyLCD: public QLCDNumber {
    public:
        MyLCD(QWidget* parent=0) : QLCDNumber (parent){}
     
    protected:
        void mouseReleaseEvent(QMouseEvent *e) {
            qDebug("je suis bien dans le click");
            if (e->button() == Qt::LeftButton)
                display(intValue()+1);
         }
    };
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
     
        MyLCD* lcd = new MyLCD(this);
    }

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

Discussions similaires

  1. [XL-2007] Compteur s'incrémentant sur clic
    Par patrick.iribarne dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/03/2015, 10h25
  2. Incrémenter au clic sur un bouton
    Par dede4 dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2011, 16h10
  3. [Debutant] Menu sur clic de souris
    Par chabannou dans le forum Windows
    Réponses: 8
    Dernier message: 02/04/2005, 01h52
  4. [VB6] [MSHFlexGrid] Tri sur clic dans la première ligne
    Par degreste dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 06/03/2003, 00h42
  5. Evènement sur clic droit !?
    Par soccersoft dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/12/2002, 21h39

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