1. 程式人生 > >Pyqt5:Qpainter繪製基礎圖形(二):滑鼠拖畫

Pyqt5:Qpainter繪製基礎圖形(二):滑鼠拖畫

接著上文:繪製基礎圖形函式已經全部清楚,然後進階滑鼠拖畫。
滑鼠拖畫,需要用到滑鼠事件
滑鼠事件:
與C++Qt一樣,滑鼠事件,需要過載滑鼠事件函式如下:

def mousePressEvent(self, e):
    print("滑鼠按下事件")
    def mouseReleaseEvent(self, e): 
        print("滑鼠釋放事件")
        if e.button() == Qt.LeftButton:
            print("左鍵")
        elif e.button() == Qt.RightButton:
            print("右鍵"
) elif e.button() == Qt.MidButton: print("點選滾輪")
    def mouseMoveEvent(self, e):
        print("滑鼠移動事件")

滑鼠繪製圖形:
UI
點選相應按鈕,滑鼠拖動畫出對應圖形:
思路:
建立對應List用來儲存滑鼠座標點。
滑鼠左鍵點選繪製,右鍵清空
畫點:
建立List

self.Point_list = [] 

繪製點

if self.Draw == "Point": 
    len_point_list = len(self
.Point_list)/2 for i in range(int(len_point_list)): #for迴圈繪製所有座標點 painter.drawPoint(self.Point_list[i*2],self.Point_list[i*2+1]) print("DrawPoint")

滑鼠按下事件:儲存座標點

if self.Draw =="Point":
            self.Point_list.append(e.x())
            self.Point_list.append(e.y())
            self.update
()#更新介面

所有繪製:
List建立:
其中點、多邊行的繪製,皆為不確定List,所以定義為不定長空List。
其他繪製均為定長List

        self.Line_list = [0,0,0,0]
        self.Point_list = []
        self.Elipse_list = [0,0,0,0]
        self.Rectangle_list = [0,0,0,0]
        self.Polygon_list = []
        self.Pie_list = [0,0,0,0]
        self.Arc_list = [0,0,0,0]

繪製函式:
繪製多邊形部分,只有滑鼠左鍵按下三次,記錄三個座標點及以上才能繪製多邊形

    def paintEvent(self, QPaintEvent):
            painter = QPainter(self)
            painter.setPen(QColor(166,66,250))          
            painter.begin(self) 
            if self.Draw == "Line":         
                painter.drawLine(self.Line_list[0],self.Line_list[1],self.Line_list[2],self.Line_list[3])
                print("DrawLine")
            elif self.Draw == "Point":
                len_point_list = len(self.Point_list)/2
                for i  in range(int(len_point_list)):
                    painter.drawPoint(self.Point_list[i*2],self.Point_list[i*2+1])
                print("DrawPoint")
            elif self.Draw == "Elipse":
                painter.drawEllipse(self.Elipse_list[0],self.Elipse_list[1],self.Elipse_list[2],self.Elipse_list[3])
                print("DrawElipse")
            elif self.Draw == "Rectangle":
                painter.drawRect(self.Rectangle_list[0],self.Rectangle_list[1],self.Rectangle_list[2],self.Rectangle_list[3])
                print("DrawRectangle")
            elif self.Draw == "Text":
                painter.drawText(120,120,"文字")
                print("DrawText")
            elif self.Draw == "Polygon":
                polygon = QPolygon()
                if len(self.Polygon_list) >= 6:
                    polygon.setPoints(self.Polygon_list)
                    print(len(self.Polygon_list))
                    painter.drawPolygon(polygon)
                print("DrawPolygon")
            elif self.Draw == "Pie":
                painter.drawPie(self.Pie_list[0],self.Pie_list[1],self.Pie_list[2],self.Pie_list[3],0*16,120*16)
                print("DrawPie")
            elif self.Draw =="Arc":
                painter.drawArc(self.Arc_list[0],self.Arc_list[1],self.Arc_list[2],self.Arc_list[3],30*16,120*16)
                print("DrawArc")
            elif self.Draw == "Path":
                path = QPainterPath()
                path.addRect(100,100,100,100)
                path.addEllipse(150,150,60,80)
                painter.setBrush(Qt.blue)
                #path.setFillRule(Qt.WindingFill)
                path.setFillRule(Qt.OddEvenFill) 
                painter.drawPath(path)
                print("DrawPath")
            painter.end()

滑鼠按下事件:

    def mousePressEvent(self, e):
        if self.Draw == "Line" :
            self.Line_list[0] = e.x()
            self.Line_list[1] = e.y()
            print("start",self.Line_list[0],self.Line_list[1])
        elif self.Draw =="Point":
            self.Point_list.append(e.x())
            self.Point_list.append(e.y())
            self.update()
        elif self.Draw == "Elipse":
            self.Elipse_list[0]=e.x()
            self.Elipse_list[1]=e.y()
        elif self.Draw == "Rectangle":
            self.Rectangle_list[0] = e.x()
            self.Rectangle_list[1] = e.y()
        elif self.Draw == "Polygon":
            self.Polygon_list.append(e.x())
            self.Polygon_list.append(e.y())
            print(self.Polygon_list)
            self.update()
        elif self.Draw == "Pie":
            self.Pie_list[0] = e.x()
            self.Pie_list[1] = e.y()
        elif self.Draw == "Arc":
            self.Arc_list[0] = e.x()
            self.Arc_list[1] = e.y()

        if e.button() == Qt.RightButton:
            self.Point_list.clear()
            self.Elipse_list = [0,0,0,0]
            self.Rectangle_list = [0,0,0,0]
            self.Polygon_list.clear()
            self.Pie_list = [0,0,0,0]
            self.Arc_list = [0,0,0,0]
            self.update()

滑鼠移動事件:
除畫線以為,其他第二個座標點均為相對座標點,長,寬或者半徑

    def mouseMoveEvent(self, e):
        if self.Draw == "Line" :
            self.Line_list[2] = e.x()
            self.Line_list[3] = e.y()
            print("end",self.Line_list[2],self.Line_list[3])
            self.update()
        elif self.Draw == "Elipse":
            self.Elipse_list[2] = e.x()-self.Elipse_list[0]
            self.Elipse_list[3] = e.y()-self.Elipse_list[1]
            self.update()
            print("Radius",self.Elipse_list[2],self.Elipse_list[3])
        elif self.Draw == "Rectangle":
            self.Rectangle_list[2] = e.x()-self.Rectangle_list[0]
            self.Rectangle_list[3] = e.y()-self.Rectangle_list[1]
            self.update()
        elif self.Draw == "Pie":
            self.Pie_list[2] = e.x() - self.Pie_list[0]
            self.Pie_list[3] = e.y() - self.Pie_list[1]
            self.update()
        elif self.Draw == "Arc":
            self.Arc_list[2] = e.x() - self.Arc_list[0]
            self.Arc_list[3] = e.y() - self.Arc_list[1]
            self.update()

原始碼如下:
原始碼