前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pyqt5:Qpainter绘制基础图形(二):鼠标拖画

Pyqt5:Qpainter绘制基础图形(二):鼠标拖画

作者头像
何其不顾四月天
发布2023-03-10 13:41:05
9020
发布2023-03-10 13:41:05
举报
文章被收录于专栏:四月天的专栏四月天的专栏

接着上文:绘制基础图形函数已经全部清楚,然后进阶鼠标拖画。 鼠标拖画,需要用到鼠标事件 鼠标事件: 与C++Qt一样,鼠标事件,需要重载鼠标事件函数如下:

代码语言:javascript
复制
def mousePressEvent(self, e):
    print("鼠标按下事件")
代码语言:javascript
复制
    def mouseReleaseEvent(self, e): 
        print("鼠标释放事件")
        if e.button() == Qt.LeftButton:
            print("左键")
        elif e.button() == Qt.RightButton:
            print("右键")
        elif e.button() == Qt.MidButton:
            print("点击滚轮")
代码语言:javascript
复制
    def mouseMoveEvent(self, e):
        print("鼠标移动事件")

鼠标绘制图形:

UI
UI

点击相应按钮,鼠标拖动画出对应图形: 思路: 创建对应List用来存储鼠标坐标点。 鼠标左键点击绘制,右键清空 画点: 创建List

代码语言:javascript
复制
self.Point_list = [] 

绘制点

代码语言:javascript
复制
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")

鼠标按下事件:存储坐标点

代码语言:javascript
复制
if self.Draw =="Point":
            self.Point_list.append(e.x())
            self.Point_list.append(e.y())
            self.update()#更新界面

所有绘制: List创建: 其中点、多边行的绘制,皆为不确定List,所以定义为不定长空List。 其他绘制均为定长List

代码语言:javascript
复制
        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]

绘制函数: 绘制多边形部分,只有鼠标左键按下三次,记录三个坐标点及以上才能绘制多边形

代码语言:javascript
复制
    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()

鼠标按下事件:

代码语言:javascript
复制
    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()

鼠标移动事件: 除画线以为,其他第二个坐标点均为相对坐标点,长,宽或者半径

代码语言:javascript
复制
    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()

源代码如下: 源代码

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档