PyQt5中重写QLabe使用鼠标绘制直线(保留绘图痕迹)

PyQt5中重写QLabe使用鼠标绘制直线

1、整体思路:参考https://blog.csdn.net/zzzzjh/article/details/82985209
2、说明:因为想在实际使用中绘制多条直线,并保存或删除之前的直线,所以将鼠标坐标点保存到字典中,通过循环字典中的值实现绘制。
3、代码如下

# -*- coding: UTF-8 -*-
'''
@Project :PyQt5基础.py 
@File    :measure_Line.py
@Author  :南山叶
@Date    :2021/4/28 10:51
@Describe: 说明 直线绘制测量并显示长度
'''

# -*- coding: utf-8 -*-
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

#绘制直线
class MyLabel(QLabel):
    x0 = 0
    y0 = 0
    x1 = 0
    y1 = 0
    flag = False
    sendmsg2 = pyqtSignal(int, int,int,int)
    list = {}
    i = 0
    res = False

    # 鼠标点击事件
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.flag = True
            self.x0 = event.x()
            self.y0 = event.y()
            self.i += 1
        if event.button() == Qt.RightButton:
            self.list.clear()
            self.x0 = 0
            self.y0 = 0
            self.x1 = 0
            self.y1 = 0
            self.update()

    # 鼠标释放事件
    def mouseReleaseEvent(self, event):
        self.flag = False

    # 鼠标移动事件
    def mouseMoveEvent(self, event):
        if self.flag:
            self.x1 = event.x()
            self.y1 = event.y()
            self.update()
    # 绘制事件
    def paintEvent(self, event):
        super(MyLabel,self).paintEvent(event)
        painter = QPainter(self)
        painter.begin(self)
        painter.setPen(QPen(Qt.red, 1, Qt.SolidLine))
        font = QFont()
        font.setPointSize(8)
        painter.setFont(font)
        # 画预设图例
        painter.drawLine(40,60,100,60)
        painter.drawText(50,50,'10厘米')

        if self.res == True:
            # 设置参数
            self.list[self.i] = [self.x0, self.y0, self.x1, self.y1]
            # 画鼠标直线
            for data in self.list.values():
                if data != [0,0,0,0]:
                    painter.drawRect(QRect(QPoint(data[0] - 3, data[1] - 3), QSize(6, 6)))
                    painter.drawLine(data[0],data[1],data[2],data[3])
                    painter.drawRect(QRect(QPoint(data[2] - 3, data[3] - 3), QSize(6, 6)))

                    # 中心坐标处显示长度
                    length = round(((data[0]-data[2])**2+(data[1]-data[3])**2)**0.5,1)
                    painter.drawText(int(data[0] + (data[2] - data[0]) / 2 - 20), int(20 + max(data[1], data[3])),
                             str(length) + 'cm')
        else:
            # 画鼠标直线
            for data in self.list.values():
                if data != [0, 0, 0, 0]:
                    painter.drawRect(QRect(QPoint(data[0]-3, data[1]-3), QSize(6, 6)))
                    painter.drawLine(data[0], data[1], data[2], data[3])
                    painter.drawRect(QRect(QPoint(data[2] - 3, data[3] - 3), QSize(6, 6)))

                    # 中心坐标处显示长度
                    length = round(((data[0] - data[2]) ** 2 + (data[1] - data[3]) ** 2) ** 0.5, 1)
                    painter.drawText(int(data[0] + (data[2] - data[0]) / 2 - 20), int(20 + max(data[1], data[3])),
                                     str(length) + 'cm')
        painter.end()


class MenuDemo(QMainWindow):
    # 初始化MenuDemo子类
    def __init__(self):
        super(MenuDemo, self).__init__()
        font = QFont()
        #font.setFamily("Arial")  # 字体
        font.setPointSize(12)  # 字体大小
        self.setFont(font)
        self.setWindowTitle("图像处理")
        # 宽×高
        self.resize(800, 600)
        # 最小窗口尺寸
        self.setMinimumSize(800,600)
        # 全局布局
        alllayout = QHBoxLayout()

        self.lab = MyLabel()
        self.lab.setStyleSheet("QLabel{background:black;}")
        self.lab.setMinimumSize(600,500)

        self.btn = QPushButton('直线')
        self.btn.setStyleSheet("QPushButton{background:white;}")
        self.btn.clicked.connect(self.remove)
        # 添加控件
        alllayout.addWidget(self.lab)
        alllayout.addWidget(self.btn)
        widget = QWidget()
        widget.setLayout(alllayout)
        self.setCentralWidget(widget)

    def remove(self):
        if self.lab.res == True:
            self.btn.setStyleSheet("QPushButton{background:white;}")
            self.lab.res = False
        else:
            self.btn.setStyleSheet("QPushButton{background:yellow;}")
            self.lab.res = True


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("mark.ico"))  # 窗口图标设置
    #主窗口
    demo = MenuDemo()
    # 显示窗口
    demo.show()
    sys.exit(app.exec_())

3、运行结果
在这里插入图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值