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 :

Gestion des clic, double clic, clic droit

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut Gestion des clic, double clic, clic droit
    Bonjour,

    j'ai développé mon interface avec Qt Designer dans laquelle j'ai une QWidgetList sur laquelle je dois gérer plusieurs évènements de la souris, à savoir le simple clic, le double clic et le clic droit.

    J'ai donc les slots on_liste_clicked(), on_liste_doubleClicked() et on_liste_customContextMenuRequested().
    Le problème est que lorsque je double-clique sur la liste ou lorsque je clique droit, le code contenu dans on_liste_clicked() est exécuté, ce qui n'est pas voulu.

    Je ne suis pas arrivé à résoudre comment tenir compte de la manière dont on clique sur la liste.

    Merci de votre aide!

  2. #2
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Bonjour,

    Et pour cause, un signal clicked() ou autre ne transporte aucune information sur le clic. Je crois que tu n'as pas d'autre choix que de redéfinir mousePressEvent et mouseDoubleClickEvent dans ta classe liste, et le QMouseEvent en paramètre te permet de tester le bouton utilisé (gauche/droit/...).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    ok, merci.
    pour le moment je n'avais pas eu à créer de classe liste (en passant par Qt Designer). Mais je vais tenter ce que tu proposes. Si j'ai des soucis je reviendrai.

    a++;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    j'ai créé la classe MaListe, ce qui me permet d'accéder directement à mousePressEvent et mouseDoubleClickEvent, mais je n'arrive pas à déterminer quand on fait un simple clic ou un double clic car mousePressEvent est appelée à chaque fois. Avec le code fourni ci-dessous, quand on fait un simple clic, on ajoute bien "simple clic" dans la liste, mais quand on fait un double clic, il y a "simple clic" et "double clic" qui s'affichent.

    Comment faire pour gérer correctement les 2 cas?
    Merci pour votre aide.

    maliste.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
    16
    17
    #ifndef MALISTE_H
    #define MALISTE_H
     
    #include <QListWidget>
    #include <QMouseEvent>
     
    class MaListe : public QListWidget
    {
    public:
        MaListe(QWidget *parent = 0);
     
    private slots:
        void mousePressEvent(QMouseEvent *event);
        void mouseDoubleClickEvent(QMouseEvent *event);
    };
     
    #endif // MALISTE_H
    maliste.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
    #include "maliste.h"
     
    MaListe::MaListe(QWidget *parent) : QListWidget(parent)
    {
    }
     
    void MaListe::mousePressEvent(QMouseEvent *event)
    {
        addItem("simple clic");
    }
     
    void MaListe::mouseDoubleClickEvent(QMouseEvent *event)
    {
        addItem("double clic");
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    Bonsoir,

    j'ai apporté quelques modifications à ma classe MaListe. Pour séparer le traitement "simple clic" du traitement "double clic", je me suis servi d'un QTimerEvent.
    Le code ci-dessous fonctionne comme je le souhaite (pour le moment, il ne fait qu'afficher dans ma liste "simple clic" et "double clic"), sauf que pour le simple clic, il faut bouger la souris pour que le texte s'affiche dans la liste (ce n'est pas le cas pour le double clic puisque le addItem est dans le mouseDoubleClickEvent)

    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
    #include <QApplication>
    #include "maliste.h"
     
    MaListe::MaListe(QWidget *parent) : QListWidget(parent)
    {
        _timerId = 0;
    }
     
    void MaListe::mouseDoubleClickEvent(QMouseEvent *event)
    {
        if (_timerId) {
            killTimer(_timerId);
            _timerId = 0;
        }
        addItem("double clic");
    }
     
    void MaListe::mousePressEvent(QMouseEvent *event)
    {
        if (_timerId) {
            killTimer(_timerId);
            _timerId = 0;
        } else {
            _timerId = startTimer(QApplication::doubleClickInterval());
        }
    }
     
    void MaListe::timerEvent(QTimerEvent *e)
    {
        if (e->timerId() == _timerId) {
            if (_timerId)
                addItem("simple clic");
            killTimer(_timerId);
            _timerId = 0;
        }
    }
    Comment faire pour résoudre ce petit problème?

    Merci de votre aide!

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    Bon en fait, j'ai trouvé plus simple, pas besoin de créer de nouvelle classe. Si ça peut en aider certains voici ce que j'ai fait (ce n'est sans doute pas parfait mais ça fonctionne) :

    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
    QTimer *timer = new QTimer;
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ui->listWidget->addItem("coucou");
        connect(timer, SIGNAL(timeout()), this, SLOT(monSlot()));
        _cpt = 0;
    }
     
     
    void MainWindow::on_listWidget_clicked(const QModelIndex &index)
    {
        timer->start(QApplication::doubleClickInterval());
        _cpt++;
    }
     
    void MainWindow::monSlot()
    {
        if (_cpt == 1)
            QMessageBox::information(0, "", "simple");
        if (_cpt == 2)
            QMessageBox::information(0, "", "double");
        _cpt = 0;
        timer->stop();
    }

  7. #7
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    C'est une bonne idée, merci d'avoir partagé, d'ailleurs je ne connaissais pas QApplication::doubleClickInterval().
    Je trouve quand même cette question étrange, car tu peux remarquer en utilisation normale qu'un double clic contient toujours un simple clic avec la réaction qui va avec (sélection, etc...), et que ça va paraitre étrange d'introduire une latence entre un simple clic et son effet.

    Concernant ton code, il faudrait prévoir le cas où _cpt > 2, et utiliser plutôt un switch/case (ce serait le default donc). On peut facilement gérer le triple clic aussi de la même manière (2*QApplication::doubleClickInterval() je pense). Oui si tu ne le sais pas le triple clic existe, il permet de sélectionner un paragraphe entier de texte (1 seul mot pour le double clic).

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    effectivement, la latence après un simple clic c'est un premier défaut de mon code...
    Ensuite, il faut aussi gérer le cas du triple clic (dans mon cas je n'avais pas besoin car je sélectionne ou désélectionne des items dans une liste)

    Un défaut que je n'ai remarqué qu'après avoir posté mon code, c'est qu'il n'y a pas de différentiation entre clic droit et clic gauche... Et ça c'est embêtant, car je souhaite aussi gérer le clic droit avec ma liste, et malheureusement, je n'ai pas accès aux informations d'évènement souris dans les méthodes utilisées ici...

Discussions similaires

  1. partition ext3 : gestion des fichiers sans propriétaire ni droits particuliers
    Par Thrystan dans le forum Administration système
    Réponses: 2
    Dernier message: 13/08/2009, 17h12
  2. ordre d'appui des boutons: clic gauche et clic droit
    Par elomkokou dans le forum VB.NET
    Réponses: 5
    Dernier message: 17/10/2008, 11h04
  3. gestion des evenements du clic droit de la souris
    Par christianf dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 01/09/2007, 15h01
  4. Réponses: 1
    Dernier message: 15/02/2007, 16h29
  5. Réponses: 2
    Dernier message: 26/11/2006, 21h10

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