QWidget上的QPixmap绘图点(pyqt5)

时间:2017-10-20 16:26:13

标签: python pyqt pyqt5 qwidget paintevent

我有一个带QLayout的QWidget,其中有一个QLabel。 我在标签上设置了一个QPixmap。无论用户点击图像,我想绘制一个点。我定义了mouseReleaseEvent(可以工作)和paintEvent(但是没有绘制点)。我已经阅读了所有类似的问题,但没有一个解决方案适合我。有帮助吗?我的相关代码:

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()

1 个答案:

答案 0 :(得分:1)

当您使用QtGui.QCursor.pos()获取光标相对于屏幕的坐标时,但是当您想要绘制小部件时,您必须位于小部件的坐标中,因为小部件具有{{ 1}}方法:

mapToGlobal()

但是在这种情况下还有另一个解决方案,您必须使用返回self.mapFromGlobal(QtGui.QCursor.pos()) 的事件,该事件包含mouseReleaseEvent方法中的信息:

pos()

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

完整代码:

drawPixmap()

enter image description here