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

效果展示:

Pyqt5入门学习笔记(四)在QLabel显示的图片上绘制点和矩形_第1张图片

三、画矩形框

实现的方法和绘制点类似,只是多了一个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

效果展示:

Pyqt5入门学习笔记(四)在QLabel显示的图片上绘制点和矩形_第2张图片

四、QPainter画点和矩形

矩形:
QRect()参数:起点的x,起点的y,长,宽;
rect=QRect(self.x0,self.y0,abs(self.x1-self.x0),abs(self.y1-self.y0))
给painter对象设置画笔样式setPen();QPen(Qt.red,2,Qt.SolidLine)的第一个参数颜色可以用Qt库自带的一些颜色,也可以用QColor类,这样就可以用RGB等多种颜色模型。
painter=QPainter(self)
painter.setPen(QPen(Qt.red,2,Qt.SolidLine))
最后drawRect(rect):
painter.drawRect(rect)

点:

开始绘制:

painter.begin(self) 

设置画笔样式-颜色和粗细:

painter.setPen(QPen(QColor(0,255,0), 7)) 

drawPoint参数是点的坐标:

painter.drawPoint(self.x,self.y)

结束在窗口的绘制:

painter.end()

你可能感兴趣的:(pyqt5)