2017-10-20 173 views
0

我有一个QLidget,上面有一个QLabel,上面有一个QLabel。 我在标签上设置了一个QPixmap。无论用户点击图像,我想画一个点。我定义了mouseReleaseEvent(哪个工作)和paintEvent(但没有绘制点)。我已阅读所有类似的问题,但没有任何解决方案适用于我。任何帮助?我的相关代码:在QWidget上绘制QPixmap上的点(pyqt5)

class ImageScroller(QtWidgets.QWidget): 

    def __init__(self, img): 
     QtWidgets.QWidget.__init__(self) 
     main_layout = QtWidgets.QVBoxLayout() 
     self._image_label = QtWidgets.QLabel() 
     self._set_image(img) 
     main_layout.addWidget(self._image_label) 
     main_layout.addStretch() 
     self.setLayout(main_layout) 

    def _set_image(self, img): 
     img = qimage2ndarray.array2qimage(img) 
     qimg = QtGui.QPixmap.fromImage(img) 
     self._img_pixmap = QtGui.QPixmap(qimg) 
     self._image_label.show() 

    def paintEvent(self, paint_event): 
     painter = QtGui.QPainter(self) 
     painter.begin(self) 
     painter.setPen(QtGui.QPen(QtCore.Qt.red)) 
     pen = QtGui.QPen() 
     pen.setWidth(20) 
     painter.setPen(pen) 
     painter.setRenderHint(QtGui.QPainter.Antialiasing, True) 
     painter.drawPoint(300,300) 
     painter.drawLine(100, 100, 400, 400) 
     for pos in self.chosen_points: 
      painter.drawPoint(pos) 
     painter.end() 

    def mouseReleaseEvent(self, cursor_event): 
     self.chosen_points.append(QtGui.QCursor().pos()) 
     self.update() 
+0

哪里是你'mouseReleaseEvent'实现?你有没有调用'update()'方法? – eyllanesc

+0

是的,我有。我使用mouseReleaseEvent实现编辑了帖子 –

回答

0

当您使用QtGui.QCursor.pos()越来越光标的坐标相对于屏幕,但是当你要画你必须在widget的坐标的部件,它的部件有mapToGlobal()方法:

self.mapFromGlobal(QtGui.QCursor.pos()) 

但在这种情况下,有另一种解决方案,您必须使用返回mouseReleaseEvent已在pos()方法的信息事件:

cursor_event.pos() 

另一个问题是您创建的标签位于小部件上方,因此您看不到点,最简单的方法是直接使用drawPixmap()方法绘制QPixmap

完整代码:

from PyQt5 import QtWidgets, QtGui, QtCore 


class ImageScroller(QtWidgets.QWidget): 
    def __init__(self): 
     self.chosen_points = [] 
     QtWidgets.QWidget.__init__(self) 
     self._image = QtGui.QPixmap("image.png") 

    def paintEvent(self, paint_event): 
     painter = QtGui.QPainter(self) 
     painter.drawPixmap(self.rect(), self._image) 
     pen = QtGui.QPen() 
     pen.setWidth(20) 
     painter.setPen(pen) 
     painter.setRenderHint(QtGui.QPainter.Antialiasing, True) 
     painter.drawPoint(300, 300) 
     painter.drawLine(100, 100, 400, 400) 
     for pos in self.chosen_points: 
      painter.drawPoint(pos) 

    def mouseReleaseEvent(self, cursor_event): 
     self.chosen_points.append(cursor_event.pos()) 
     # self.chosen_points.append(self.mapFromGlobal(QtGui.QCursor.pos())) 
     self.update() 


if __name__ == '__main__': 
    import sys 

    app = QtWidgets.QApplication(sys.argv) 
    w = ImageScroller() 
    w.resize(640, 480) 
    w.show() 
    sys.exit(app.exec_()) 

enter image description here