Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Pyqt QGraphicView système de coordonnées souris

0 votes

Je cherche à effectuer une découpe image dans une QGraphicView

  • je construit une QMainWindow contenant uen Qgraphicview et Qgraphicscene
  • Je créé les méthodes pour les event souris
    Mais j'ai un offset entre la sélection currentQrubberBand et cropPixmap affiché.

Je suppose que le problème vient du système de coordonnées, mais je n'arrive pas à le contourner.

class ImageViewer(QtWidgets.QMainWindow):
    def __init__(self):
        super(ImageViewer, self).__init__()

        self.scene = QtWidgets.QGraphicsScene()
        self.imageLabel = QtWidgets.QLabel()
        self.cropLabel = QtWidgets.QLabel()
        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidget(self.imageLabel)
        self.setCentralWidget(widget)

        self.scene.addWidget(splitter)
        self.view = QtWidgets.QGraphicsView(self.scene)
        self.view.setMouseTracking(True)
        self.view.setDragMode(QtWidgets.QGraphicsView.RubberBandDrag)

Puis je crée les méthodes de gestion de la souris

def mousePressEvent(self, eventQMouseEvent):
    print("pressed")
    self.originQPoint = self.view.mapToScene(eventQMouseEvent.pos())
    self.currentQRubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self)
    self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, QtCore.QSize()))
    self.currentQRubberBand.show()

def mouseMoveEvent(self, eventQMouseEvent):
    self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, eventQMouseEvent.pos()).normalized())

    def mouseReleaseEvent (self, eventQMouseEvent):
        #self.currentQRubberBand.hide()
        currentQRect = self.currentQRubberBand.geometry()
        print(currentQRect)
        self.currentQRubberBand.deleteLater()
        cropPixmap = self.pixmap.copy(currentQRect)
        self.cropLabel.setPixmap(cropPixmap)
        cropPixmap.save('output.png')
demandé 25-Jul par JmiXIII (112 points)

Peux-tu fournir un code minimal contenant tout ce qu'il faut pour qu'on puisse tester directement ?

Ceci marche

from PyQt5 import QtCore, QtGui, QtWidgets


class ImageViewer(QtWidgets.QMainWindow):
    def __init__(self):
        super(ImageViewer, self).__init__()

        self.label = QtWidgets.QLabel()
        self.cropLabel = QtWidgets.QLabel()
        self.setCentralWidget(self.label)

        fileName=r'C:/Users/user11.HPO-SAMAT/Pictures/Lake.jpg'
        image = QtGui.QImage(fileName)
        self.pixmap = QtGui.QPixmap.fromImage(image)
        self.label.setPixmap(self.pixmap)

    def mousePressEvent (self, eventQMouseEvent):
            self.originQPoint = eventQMouseEvent.pos()
            self.currentQRubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self)
            self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, QtCore.QSize()))
            self.currentQRubberBand.show()

    def mouseMoveEvent(self, eventQMouseEvent):
        self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, eventQMouseEvent.pos()).normalized())

    def mouseReleaseEvent (self, eventQMouseEvent):
        #self.currentQRubberBand.hide()
        currentQRect = self.currentQRubberBand.geometry()
        print(currentQRect)
        self.currentQRubberBand.deleteLater()
        cropPixmap = self.pixmap.copy(currentQRect)
        self.cropLabel.setPixmap(cropPixmap)
        cropPixmap.save('output.png')

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    imageViewer = ImageViewer()
    imageViewer.show()
    app.exec_()

Ceci créé un décalage (création des menus)
Je pense que le décalage est de la valeur des menus et si j'ajoute unQvboX ou un splitter le décalage est d'autant plus important.

from PyQt5 import QtCore, QtGui, QtWidgets


class ImageViewer(QtWidgets.QMainWindow):
    def __init__(self):
        super(ImageViewer, self).__init__()

        self.label = QtWidgets.QLabel()
        self.cropLabel = QtWidgets.QLabel()

        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidget(self.label)
        self.setCentralWidget(self.scrollArea)

        self.createActions()
        self.createMenus()

        fileName=r'C:/Users/user11.HPO-SAMAT/Pictures/Lake.jpg'
        image = QtGui.QImage(fileName)
        self.pixmap = QtGui.QPixmap.fromImage(image)
        self.label.setPixmap(self.pixmap)
        self.label.adjustSize()

    def createActions(self):
        self.openAct = QtWidgets.QAction("&Open...", self, shortcut="Ctrl+O")
        self.fitAct = QtWidgets.QAction("&Resize...", self, shortcut="Ctrl+F")
        self.ogSizeAct = QtWidgets.QAction("&Original size ...",self,shortcut="ctrl+G")

    def createMenus(self):
        self.fileMenu = QtWidgets.QMenu("&File", self)
        self.fileMenu.addAction(self.openAct)

        self.editMenu = QtWidgets.QMenu("&Edit", self)
        self.editMenu.addAction(self.fitAct)
        self.editMenu.addAction(self.ogSizeAct)

        self.menuBar().addMenu(self.fileMenu)
        self.menuBar().addMenu(self.editMenu)

    def mousePressEvent (self, eventQMouseEvent):
            self.originQPoint = eventQMouseEvent.pos()
            self.currentQRubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self)
            self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, QtCore.QSize()))
            self.currentQRubberBand.show()

    def mouseMoveEvent(self, eventQMouseEvent):
        self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, eventQMouseEvent.pos()).normalized())

    def mouseReleaseEvent (self, eventQMouseEvent):
        #self.currentQRubberBand.hide()
        currentQRect = self.currentQRubberBand.geometry()
        print(currentQRect)
        self.currentQRubberBand.deleteLater()
        cropPixmap = self.pixmap.copy(currentQRect)
        self.cropLabel.setPixmap(cropPixmap)
        cropPixmap.save('output.png')

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    imageViewer = ImageViewer()
    imageViewer.show()
    app.exec_()

1 Réponse

0 votes

J'ai laissé tombé QGraphicScene et réimplanter les event souis dans une classe QLabel

class View(QtWidgets.QLabel):
def __init__(self):
    super(View,self).__init__()

    self.cropLabel = QtWidgets.QLabel(self)
    self.label = QtWidgets.QLabel(self)

    self.ogpixmap = QtGui.QPixmap()
    fileName = r'C:/Users/user11.HPO-SAMAT/Pictures/Lake.jpg'
    image = QtGui.QImage(fileName)
    self.pixmap = QtGui.QPixmap.fromImage(image)
    self.label.setPixmap(self.pixmap)
    self.label.adjustSize()

def mousePressEvent(self, event):
    self.originQPoint = event.pos()
    self.currentQRubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self)
    self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, QtCore.QSize()))
    self.currentQRubberBand.show()

def mouseMoveEvent(self, event):
    self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, event.pos()).normalized())

def mouseReleaseEvent (self, event):
    self.currentQRubberBand.hide()
    currentQRect = self.currentQRubberBand.geometry()
    self.currentQRubberBand.deleteLater()
    cropPixmap = self.pixmap.copy(currentQRect)
    self.cropLabel.setPixmap(cropPixmap)
    cropPixmap.save('output.png')
    print(pytesseract.image_to_string(Image.open('output.png'),lang='fra'))
    get_string('output.png')

et je rapelle dans QMainWindow

class Viewer(QtWidgets.QMainWindow):
def __init__(self):
    super().__init__()

    self.view = View()
répondu 5-Aou par JmiXIII (112 points)
...