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 :

Dessin de cercles et problème de coordonnées


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Points : 23
    Points
    23
    Par défaut Dessin de cercles et problème de coordonnées
    Bonjour,

    à des fins d'orientation de clichés scannées , je souhaite créer une petite application qui ouvre une image et l'affiche sur un QGaphicsView.

    l'image concernée comporte des signes qu'on doit viser avec le curseur et récupérer ses coordonnées dans le repère image ( le 0,0 est le coin haut gauche , les sens positifs sont : à droite et en bas ) .
    Nom : one.PNG
Affichages : 501
Taille : 218,6 Ko

    Nom : two.PNG
Affichages : 473
Taille : 25,3 Ko

    de plus à chaque fois que je clique avec la souris , la mesure doit être effectué et les coordonnées relevé et on dessine un petit cercle centré sur l'endroit visé avec un numéro en dessous.

    une première façon de faire est d'implémenter un qgraphicsview unique avec toutes les fonctions de zoom dessin , calcul de coordonnées .. etc

    un deuxième façon de faire est de créer deux voir trois QGraphicsView , le premier montre l'image en entier avec un rectangle dedans qu'on peut faire bouger qui zoomerait la partie à l'intérieur du rectangle dans un deuxième Qgraphicsview qui lui même avec un autre rectangle dedans zoomera dans un troisième. ainsi on pourra zoomer sur les croix.

    Je ne sais pas laquelle est la plus facile , je ne suis qu'un débutant et je galère avec tout :

    j'ai fait une petite interface qui récupère une image et quand je clique pour dessigner un cercle , le cercle est décalée par rapport à l'endroit où j'ai cliqué , voici les codes :
    test2.py : ( Code issu de QtDesigner )
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'test2.ui'
    #
    # Created by: PyQt4 UI code generator 4.11.4
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(671, 507)
            MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.graphicsView = QtGui.QGraphicsView(self.centralwidget)
            self.graphicsView.setGeometry(QtCore.QRect(20, 10, 621, 391))
            self.graphicsView.setMouseTracking(True)
            self.graphicsView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
            self.graphicsView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
            self.graphicsView.setDragMode(QtGui.QGraphicsView.NoDrag)
            self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
            self.pushButton = QtGui.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(70, 410, 75, 23))
            self.pushButton.setObjectName(_fromUtf8("pushButton"))
            self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
            self.pushButton_2.setGeometry(QtCore.QRect(270, 410, 75, 23))
            self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
            self.pushButton_3 = QtGui.QPushButton(self.centralwidget)
            self.pushButton_3.setGeometry(QtCore.QRect(520, 410, 75, 23))
            self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 671, 21))
            self.menubar.setObjectName(_fromUtf8("menubar"))
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName(_fromUtf8("statusbar"))
            MainWindow.setStatusBar(self.statusbar)
     
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
            self.pushButton.setText(_translate("MainWindow", "Open Img", None))
            self.pushButton_2.setText(_translate("MainWindow", "Open", None))
            self.pushButton_3.setText(_translate("MainWindow", "Close", None))
     
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    tester_2 :
    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
    43
    44
    45
    import sys
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from test2 import *
     
    class tester(QMainWindow, Ui_MainWindow):
        def __init__(self,parent=None):
            super(tester,self).__init__(parent)
            self.setupUi(self)
     
            self.scene = QGraphicsScene()
            self.graphicsView.setScene(self.scene)
     
            self.connect(self.pushButton_3,SIGNAL("clicked()") , self.close)
            self.connect(self.pushButton,SIGNAL("clicked()") , self.open_img)
     
     
        def open_img(self):
            self.filepath = QFileDialog.getOpenFileName(self,"Open",".","*jpg")
            self.img = QImage(self.filepath)
            if self.img.isNull():
                print("error")
                return
            self.set_pixmap()
     
        def set_pixmap(self):
            self.scene.addPixmap(QPixmap.fromImage(self.img))
     
        def draw(self):
            painter = QPainter()
            painter.begin(self.img)
            painter.drawEllipse(QPointF(self.x,self.y),10,10)
            painter.end()
            self.scene.addPixmap(QPixmap.fromImage(self.img))
     
     
        def mousePressEvent(self,event):
            self.x , self.y = event.pos().x() , event.pos().y()
            self.draw()
            self.statusbar.showMessage("%f , %f"%(self.x,self.y))
     
    app = QApplication(sys.argv)
    sh = tester()
    sh.show()
    app.exec_()
    j'ai essayé de faire en sorte que l'origine du event.pos ( sommet haut gauche du QGraphicsview ) soit le même que self.img utilisé par QPainter , mais visiblement ça ne marche pas


    Un autre problème est celui des coordonnées , comment les synchroniser ? event.pos() , renvoie les coordonnées dans la partie du QGraphicsView et n'en pas les coordonnées pixels de l'image , donc faudra t il faire une division par rapport à la taille réel de l'image ?

    de plus j'ai remarqué que même quand je clique en dehors du QgraphicsView , mousePressEvent renvoie des coordonnées , je ne veux pas cela , il faut que ça fonctionne uniquement dans la zone du graphique.

    si vous avez d'autres idées pour faciliter ou si je ne fais pas les choses correctement.. n'hésitez pas , de l'aide serait le bienvenu :)

    Bien Cordialement,

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    C'est bon , j'ai trouvé les solutions à mes problèmes

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

Discussions similaires

  1. [CImg] Problème pour dessiner des cercles
    Par Bloodista dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/09/2012, 11h07
  2. Dessiner un cercle avec des coordonnées géographiques
    Par giloutho dans le forum Mathématiques
    Réponses: 17
    Dernier message: 14/10/2010, 12h05
  3. Réponses: 10
    Dernier message: 11/04/2007, 11h14
  4. Dessiner un cercle
    Par delire8 dans le forum DirectX
    Réponses: 7
    Dernier message: 26/07/2003, 12h11

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