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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    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 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
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    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();
    }

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