Pyqt5入门学习笔记(四)在QLabel显示的图片上绘制点和矩形 | 您所在的位置:网站首页 › wps如何在图片上画画框 › Pyqt5入门学习笔记(四)在QLabel显示的图片上绘制点和矩形 |
一、Label加载图片
Qlabel显示图片在这里就不赘述了,方法很简单,用函数setPixmap即可,本篇博客主要将如何在加载的图片上绘制点和矩形。 二、画点 (1)实现一个新的类继承QLabel; (2)重写QLabel的mousePressEvent(鼠标按下):用event.buttons() == QtCore.Qt.LeftButton判断是左键按下,event.buttons() == QtCore.Qt.RightButton是右键按下,可以通过event.pos( )来获取点击处的坐标位置。 (3)重写mouseReleaseEvent(鼠标释放)方法;可以在这里进行刷新显示或者获取点的位置,也可以放在mousePressEvent中。 (4)重写paintEvent:初始化继承的父类(可省略),声明QPainter()对象来进行绘图,打点用的是drawPoint()函数,关于QPainter的常见用法见第四部分。在这里我的左右键按下打的点设置的是不同的颜色 (5)self.update()用来刷新显示绘制的点,我设置了一个bool变量isShow来控制是否画点,即是否显示绘制的点在图像上。 class MyLabel_inteSeg(QLabel): def __init__(self, parent=None): super(MyLabel_inteSeg, self).__init__((parent)) self.flag = False self.isShow = False self.point_type=0 #0-左键前景点,1-右键背景点 self.clk_pos=None self.x=None self.y=None def mousePressEvent(self, event): QLabel.mousePressEvent(self, event) #self.clear() if event.buttons() == QtCore.Qt.LeftButton: print("左键按下") self.point_type=0 elif event.buttons() == QtCore.Qt.RightButton: print("右键按下") self.point_type=1 self.clk_pos = event.globalPos() self.x = event.x() self.y = event.y() if self.isShow==True: self.update() def paintEvent(self, event): super().paintEvent(event) painter = QPainter() print("paintEvent self.isShow:{}".format(self.isShow)) if self.isShow==True: if self.point_type==0: painter.begin(self) painter.setPen(QPen(QColor(255,0,0), 7)) painter.drawPoint(self.x,self.y) painter.end() elif self.point_type==1: painter.begin(self) painter.setPen(QPen(QColor(0,255,0), 7)) painter.drawPoint(self.x,self.y) painter.end() def mouseReleaseEvent(self, event): QLabel.mouseReleaseEvent(self, event) #self.isShow = False def getPointGlobalPos(self): return self.clk_pos效果展示: 实现的方法和绘制点类似,只是多了一个mouseMoveEvent()。 (1)实现一个新的类继承QLabel; (2)重写mousePressEvent:通过event.x(),event.y()获得矩形框的起始点,即对角线的一个点的坐标。我通过self.flag设为True表示开始绘制矩形。 (3)重写mouseMoveEvent(鼠标移动):当flag为True时,self.update()实时刷新显示绘制,通过event.x( ),event.y( )获得矩形框的终止点,即对角线的另一个点的坐标,因为是实时刷新显示的,所以坐标代码必须放在这里。 (4)重写mouseReleaseEvent(鼠标释放)方法; (5)重写paintEvent:通过变量isShow来控制矩形框是否显示。drawRect( )函数用来绘制矩形。 class MyLabel(QLabel): def __init__(self, parent=None): super(MyLabel, self).__init__((parent)) self.x0=0 self.y0=0 self.x1=0 self.y1=0 self.pos0=None self.pos1=None self.flag=False self.isShow=False def paintEvent(self, event): super().paintEvent(event) rect=QRect(self.x0,self.y0,abs(self.x1-self.x0),abs(self.y1-self.y0)) painter=QPainter(self) painter.setPen(QPen(Qt.red,2,Qt.SolidLine)) if self.isShow==True: painter.drawRect(rect) # qp.begin(self) # qp.end() def mousePressEvent(self, event): QLabel.mousePressEvent(self,event) self.flag=True self.pos0=event.globalPos() self.x0=event.x() self.y0=event.y() def mouseMoveEvent(self, event): QLabel.mouseMoveEvent(self,event) if self.flag: self.pos1 = event.globalPos() self.x1=event.x() self.y1=event.y() self.update() def mouseReleaseEvent(self, event): QLabel.mouseReleaseEvent(self,event) self.flag=False self.isShow = False def getRectGlobalPos(self): #返回绝对坐标 poses=[(self.pos0.x(),self.pos0.y())] poses.append((self.pos1.x(),self.pos1.y())) return poses效果展示: 点: 开始绘制: painter.begin(self)设置画笔样式-颜色和粗细: painter.setPen(QPen(QColor(0,255,0), 7))drawPoint参数是点的坐标: painter.drawPoint(self.x,self.y)结束在窗口的绘制: painter.end() |
CopyRight 2018-2019 实验室设备网 版权所有 |