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

PyQt Python Discussion :

Récupération des coordonnées du pointeur


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut Récupération des coordonnées du pointeur
    Bonjour a tous,

    je fais face a un probleme de recuperation des coordonnees de la souris lorsque je clique sur un Widget et je tourne en rond...

    Je vais tenter d'etre clair et precis:

    1) J'ai une interface graphique "principale" avec un bouton 'Position', et lorsque je clique sur ce bouton, cela m'ouvre un QDialog, dans lequel j'ai insere un QLabel.

    2) Mon but est de recuperer les coordonnees de la souris par rapport a ce QLabel, lorsque je clique sur ce QLabel.



    Dans l'API Qt (http://qt.developpez.com/doc/latest/qmouseevent.html#x) il y a cette methode suivante:
    int QMouseEvent:: x () const

    Returns the x position of the mouse cursor, relative to the widget that received the event.

    See also y() and pos().
    C'est exactement ce que je veux, mais le probleme est que lorsque je clique il ne se passe rien, et lorsque mon QDialog s'ouvre j'obtiens les coordonnees du QLabel par rapport au QDialog !!



    Dans le __init__ de mon application (pushButton_position est le bouton sur lequel je clique pour ouvrir ma boite de dialogue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QtCore.QObject.connect( ui.pushButton_position, QtCore.SIGNAL("clicked()"), self.managePositionCamera )
    La methode liee au bouton precedent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def managePositionCamera(self):
     
    	PosCamera.setVisible(True)
    	ui_pos.label_locationXY.setMouseTracking(True)
     
    	print 'X =',pt.x()
    	print 'Y =',pt.y()


    Mon erreur doit surement venir du fait que je n'applique pas la methode au QLabel directement, mais les signaux proposes par QT concernant un QLabel ne correspondent pas a un clic dessus (par exemple clicked() comme pour un bouton...

    En esperant que vous m'avez compris, merci par avance

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Par défaut
    Tu peux créer une classe qui hérite de QLabel et où tu redéfinis la méthode mousePressEvent.
    http://qt.developpez.com/doc/latest/...ousePressEvent

    Cette méthode sera appelée lorsque tu cliqueras sur le label.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    D'accord je saisi le concept, mais etant debutant en Python je ne vois pas trop comment implementer tout ca

    Tu pourrais m'indiquer en gros l' "architecture" ?? Avec l'heritage notamment, et que faut-il que je mette dans le __init__ de ma nouvelle classe ?? Et ensuite je l'appelle comment cette nouvelle classe ??

    J'en demande beaucoup mais je vais chercher aussi de mon cote... ca m'aidera pour apprendre !!

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Par défaut
    Voici un exemple minimaliste.
    Lorsque tu cliques sur le label, ça écrit les coordonnées du clic dans la sortie standard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class MonLabel(QLabel):
        def mousePressEvent(self, event):
            print event.x(), event.y()
    Ce n'est pas obligé à priori de redéfinir le constructeur __init__ à moins que tu veuilles que ton label ai accès à d'autres objets.

    Pour utiliser ça dans ton code, à l'endroit où tu crées ton label, tu remplaces (par exemple, je ne connais pas ton code)
    par Précise moi si tu te sers de QDesigner pour faire ton interface graphique car dans ce cas, il y a des manières élégantes de faire ça.

    Sinon juste un détail.
    Je vois que tu as écrit ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tCore.QObject.connect( ui.pushButton_position, QtCore.SIGNAL("clicked()"), self.managePositionCamera )
    Depuis un des dernières versions de PyQt (>= 4.6 je crois), tu peux utiliser la syntaxe bien plus pythonesque suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui.pushButton_position.clicked.connect(self.managePositionCamera )

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    Ah oui ca n'a pas l'air si complique que ca finalement !!

    Juste pour te repondre j'utilise bien QDesigner et donc ce n'est pas moi qui defini le QLabel, et donc pour l'utiliser je fais un ui.label.setText(...) par exemple. Du coup comment puis-je lui dire que c'est un MonLabel et non pas un QLabel ??


    ps: merci pour cette nouvelle syntaxe, elle marche tres bien et est plus rapide a ecrire mais j'aime bien l' "ancienne" ou l'on voit bien le SIGNAL et la structure du connect

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Par défaut
    Pour Designer, tu peux cliquer droit sur le widget qui t'intéresse et choisir "Promote To". Là, tu nommes le widget qui tu veux obtenir (ici MonLabel) et tu mets par exemple monlabel.h comme fichier d'entête.
    Le widget sera maintenant considéré comme du type MonLabel.

    Pour que ça marche, il faut essayer déplacer la définition de ta classe MonLabel dans un fichier monlabel.py.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/10/2008, 07h28
  2. Récupération des coordonnées de la souris
    Par kabil.cpp dans le forum MFC
    Réponses: 11
    Dernier message: 23/05/2008, 06h43
  3. Réponses: 0
    Dernier message: 13/11/2007, 11h39
  4. Réponses: 2
    Dernier message: 15/06/2007, 10h08
  5. Réponses: 8
    Dernier message: 04/06/2007, 11h51

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