如何获得鼠标在QPixmap而不是QMainWindow上的位置?

问题描述 投票:0回答:1

enter image description here I

我有一个QMainWindow,其中包含带有QPixmap的QWidget。当我尝试获取鼠标单击的位置时,它将基于QMainWindow而不是基于QPixmap进行显示(即使在图像的灰色区域也是如此)。谁能帮助我如何将x,y位置从QMainWindow传递到QPixmap(图像)坐标?

下面的代码专门返回整个QMainWindow的x,y坐标,而不是QPixmap(仅在图像上)。

 class ImageViewer(QtGui.QMainWindow):
       def __init__(self, input, name):
            super(ImageViewer, self).__init__()
            self.image_series = input
            self.starter()


      def starter(self): 
           self.setWindowTitle(self.title)
           self.main_Viewer_frame = QtGui.QFrame()
           self.setCentralWidget(self.main_Viewer_frame)
           self.main_Viewer_frame_layout = QtGui.QGridLayout()
           self.show()
           self.main_Viewer_frame.mousePressEvent = self.getpos

     def getpos(self, event):
           x = event.pos().x()
           y = event.pos().y()
           print(x,y)


class SliceViewer(QtGui.QGraphicsView):

     def __init__(self, input, *args, **kwargs):
          self.scene = QtGui.QGraphicsScene()
          super(SliceViewer, self).__init__(self.scene, *args, **kwargs)
          self.setScene(self.scene)
          self.img_overlay = self.scene.addPixmap(self.getPixmap(input))


viewer = SliceViewer(img.png)
window = ImageViewer(img.png, "Super Mario")
window.layout.addwidget(viewer) 
python python-3.x pyside
1个回答
0
投票

您有以下错误:

  • 不要将函数分配给从类继承为mousePressEvent的方法,因为它已经具有预定义的行为,但是当您执行X时,您将删除它。

  • 您必须使用QGraphicsView的mouseClicked方法来获得对场景的点击,然后进行必要的转换以获得相对于QGraphicsPixmapItem的位置(相当于相对于QPixmap的位置) 。

考虑到上述,解决方法是:

from PySide import QtCore, QtGui


class SliceViewer(QtGui.QGraphicsView):
    pixmapClicked = QtCore.Signal(QtCore.QPoint)

    def __init__(self, filename, *args, **kwargs):
        self._scene = QtGui.QGraphicsScene()
        super(SliceViewer, self).__init__(self._scene, *args, **kwargs)
        self.img_overlay = self._scene.addPixmap(QtGui.QPixmap(filename))

    def mousePressEvent(self, event):
        vp = event.pos()
        if self.itemAt(vp) == self.img_overlay:
            sp = self.mapToScene(vp)
            lp = self.img_overlay.mapFromScene(sp).toPoint()
            self.pixmapClicked.emit(lp)
        super(SliceViewer, self).mousePressEvent(event)


class ImageViewer(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ImageViewer, self).__init__(parent)

        viewer = SliceViewer("/path/of/Super Mario")

        central_widget = QtGui.QFrame()
        self.setCentralWidget(central_widget)
        lay = QtGui.QGridLayout(central_widget)
        lay.addWidget(viewer)

        self.setGeometry(200, 200, 512, 512)

    @QtCore.Slot(QtCore.QPoint)
    def on_pixmapClicked(self, point):
        print(point)


if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    w = ImageViewer()
    w.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.