我有一个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)
您有以下错误:
不要将函数分配给从类继承为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_())