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 ) .
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 )
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
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_())
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
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_()
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,
Partager