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 :

Dessiner à la souris


Sujet :

PyQt Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Dessiner à la souris
    Bonjour,

    Dans le cadre d'un projet universitaire, je dois réaliser, notamment, une interface graphique permettant de dessiner à la souris, avant d'effectuer un traitement sur le dessin.

    Je suis parvenu à utiliser un QWidget pour dessiner, mais le problème que j'ai est que le tracé n'est pas en continu, c'est-à-dire que les points que je trace ne sont pas contigus.

    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
    37
    38
    39
    40
    41
    42
    import sys, random
    from PyQt4 import QtGui, QtCore
     
    class Example(QtGui.QWidget):
     
    	def __init__(self):
    		super(Example, self).__init__()
    		self.pointsList = []#liste des points à tracer
    		self.isDrawing = 0#variable de contrôle
    		self.initUI()
     
    	def initUI(self):	  
    		self.setGeometry(300, 300, 280, 170)
    		self.setWindowTitle('Points')
    		self.show()
     
    	def mousePressEvent(self, event):
    		self.isDrawing = 1
    		self.pointsList = []
     
    	def mouseReleaseEvent(self, event):
    		self.isDrawing = 0
     
    	def mouseMoveEvent(self, event):
    		if self.isDrawing == 1:
    			self.pointsList.append(event.pos())#on ajoute le point
    			self.repaint()#on redessine
     
    	def paintEvent(self, e):
    		qp = QtGui.QPainter()
    		qp.begin(self)
    		for point in self.pointsList:
    			qp.drawPoint(point)
    		qp.end()
     
    def main():	
    	app = QtGui.QApplication(sys.argv)
    	ex = Example()
    	sys.exit(app.exec_())
     
    if __name__ == '__main__':
    	main()
    Est-ce que j'utilise la bonne classe, avec QWidget, ou bien n'est-ce pas la plus appropriée pour faire ce que je souhaite ?

    Que me conseillez-vous pour résoudre mon problème ?

    Je précise que je suis débutant en Python et en PyQt.

    Merci d'avance,

    Jérémy

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bon ce que je dis est peut-être faux, car jamais testé, mais tes points devraient me semble-t-il être créés grâce à la classe QPointF et si j'ai bien compris ce que le terme contigu veut dire, utiliser la fonction drawline() qui prend en paramètres 2 points créés avec la classe QPointF.

    Donc à tester
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai pensé à tracer des lignes, mais le problème qui se pose, est que j'ai réellement besoin que les points soient contigus (qu'ils se touchent), pas tant pour la beauté du dessin, mais pour le traitement que je dois en faire ensuite.

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    J'ai pensé à tracer des lignes, mais le problème qui se pose, est que j'ai réellement besoin que les points soient contigus (qu'ils se touchent), pas tant pour la beauté du dessin, mais pour le traitement que je dois en faire ensuite.
    Qu'est-ce qui te fais dire que ce que je t'ai dis ne fonctionne pas? Tu as testé, que se passe-t-il?

    Tu as lu la doc? J'ai pourtant l'impression qu'on parle de la même chose...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je n'avais pas testé, je viens de le faire, cela me donne bien un tracé continu.

    L'idée de mon message précédent est que j'ai besoin d'avoir tous les points pour faire le traitement, et je pensais les récupérer au fur et à mesure du tracé (en les ajoutant à ma liste de points, dans mouseMoveEvent()).

    Saur que cela ne se passe pas comme ça, d'où mon problème en ne traçant que les points, et pas des lignes.

    Il doit donc falloir calculer la liste de tous les points tracés, c'est-à-dire ceux que j'avais dans ma liste (les extrémités des lignes) et ceux que je n'avais pas (tous ceux qui composent la ligne, sauf les extrémités).

    Quelle est la différence entre les QPoint et les QPointF, si ce n'est le fait que ce sont des float plutôt que des int ?

    Merci

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Quelle est la différence entre les QPoint et les QPointF, si ce n'est le fait que ce sont des float plutôt que des int ?
    Citation Envoyé par La doc
    Draws a line from (x1, y1) to (x2, y2) and sets the current pen position to (x2, y2).
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Juste pour chahuter un peu.

    L'idée de mon message précédent est que j'ai besoin d'avoir tous les points pour faire le traitement, et je pensais les récupérer au fur et à mesure du tracé (en les ajoutant à ma liste de points, dans mouseMoveEvent())
    Pour des raisons physiques, les mouseEvent ne sont pas générés en continu.
    Au mieux, vous aurez une liste de points plus ou moins espacés qui pourraient définir les segments d'un polygone.

    Il doit donc falloir calculer la liste de tous les points tracés, c'est-à-dire ceux que j'avais dans ma liste (les extrémités des lignes) et ceux que je n'avais pas (tous ceux qui composent la ligne, sauf les extrémités).
    Le point étant de dimension nulle, le nombre de points d'un segment non null est infini. C'est pourquoi, depuis fort longtemps, on se contente des extrémités: elles sont nécessaires et suffisantes.

    nota la carte graphique allume des "pixels", ce ne sont pas des points. Mais quel sens donner à la relation "est contigu" dans ce cas?

    Ce qui n'interdit pas de représenter un segment avec une liste de 100 points.
    Si c'est pour représenter un segment c'est superflu, car cela n'ajoute aucune information.

    Mais pourquoi choisir 100 plutôt que 1000 ou 10?
    Parce que l'algorithme de traitement!
    Curieux mais pourquoi pas.

    Ceci dit, côté graphique, pourquoi infliger 1000*appels à QPoint alors qu'il suffirait d'appeler une seule fois drawline?

    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Dessiner à la souris
    Par Th0ms0n dans le forum Qt
    Réponses: 5
    Dernier message: 20/02/2013, 01h05
  2. Dessiner à la souris
    Par co2gaz dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 30/03/2011, 23h28
  3. Gestions évènements avec souris - Dessiner avec souris
    Par CosaNostra dans le forum Débuter
    Réponses: 10
    Dernier message: 23/01/2010, 10h05
  4. Dessiner à la souris sur le plan XZ
    Par DjGonk dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/02/2008, 16h25
  5. Réponses: 4
    Dernier message: 10/09/2006, 19h06

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