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

效果展示:

四、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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章