Python 在QWidget(pyqt5)上的QPixmap上绘制点

Python 在QWidget(pyqt5)上的QPixmap上绘制点,python,pyqt,pyqt5,qwidget,paintevent,Python,Pyqt,Pyqt5,Qwidget,Paintevent,我有一个带有QLayout的QWidget,上面有一个QLabel。 我在标签上设置了一个QPixmap。无论用户在哪里单击图像,我都要画一个点。我定义了mouseReleaseEvent(有效)和paintEvent(但没有绘制点)。我读过所有类似的问题,但没有一个解决方案适合我。有什么帮助吗?我的相关代码: class ImageScroller(QtWidgets.QWidget): def __init__(self, img): QtWidgets.QWidg

我有一个带有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()

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

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

self.mapFromGlobal(QtGui.QCursor.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_())

您的
mouseReleaseEvent
实现在哪里?你调用了
update()
方法了吗?是的,我调用了。我用mouseReleaseEvent实现编辑了这篇文章