我有一个带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())
但在这种情况下还有另一种解决方案,您必须使用返回具有pos()方法中信息的mouseReleaseEvent的事件:
cursor_event.pos()
另一个问题是您创建的标签位于小部件上方,因此您看不到这些点,最简单的方法是使用drawPixmap()方法直接绘制QPixmap.
完整代码:
from PyQt5 import QtWidgets, QtGui, QtCoreclass 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_())
来源:https://www.icode9.com/content-1-495401.html
联系客服