打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python – QWidget上的QPixmap上的绘图点(pyqt5)

我有一个带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
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PyQt5快速入门(六)PyQt5 GUI界面设计
基于Paddle的截图&OCR文字识别的实现
pyqt4制作透明无边框窗体
Python实现可以语音聊天的桌面宠物程序
【第七节】PyQt5控件
PyQt4 信号和槽详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服