重写QLabel类,使QLabel显示的图片可以随鼠标滚轮缩放、随鼠标左键拖动

1.软件平台

程序语言为python,需配置PyQt库,环境配置参考:http://t.csdnimg.cn/7uXys

2.程序设计

代码自定义了一个继承QLabel类的子类MyLabel,用于显示图像并实现图像交互功能,通过鼠标拖动和滚轮操作,可以实现图像的平移和缩放,提升用户交互体验。

from PyQt5.QtCore import Qt, QPoint, QPointF, QRectF
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QLabel


class MyLabel(QLabel):

    # 缩放比例的最小值和最大值
    SCALE_MIN_VALUE = 0.05
    SCALE_MAX_VALUE = 10.0

    def __init__(self, parent=None):
        super(MyLabel, self).__init__(parent)
        self.setMouseTracking(True)
        self.m_scaleValue = 0.25    # 缩放比例初始值
        self.m_rectPixmap = QRectF()
        self.m_scalePixmap = QRectF()
        self.m_drawPoint = QPointF(0.0, 0.0)
        self.m_pressed = False
        self.m_lastPos = QPoint()

    def set_image(self, img):
        self.setPixmap(img)
        self.m_rectPixmap = QRectF(self.pixmap().rect())
        self.update()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.m_pressed = True
            self.m_lastPos = event.pos()

    def mouseMoveEvent(self, event):
        if self.m_pressed:
            delta = event.pos() - self.m_lastPos
            self.m_lastPos = event.pos()
            self.m_drawPoint += delta
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.m_pressed = False

    def wheelEvent(self, event):
        if not self.m_rectPixmap.isEmpty():
            oldScale = self.m_scaleValue
            if event.angleDelta().y() > 0:
                self.m_scaleValue *= 1.1
            else:
                self.m_scaleValue *= 0.9
            if self.m_scaleValue > self.SCALE_MAX_VALUE:
                self.m_scaleValue = self.SCALE_MAX_VALUE
            if self.m_scaleValue < self.SCALE_MIN_VALUE:
                self.m_scaleValue = self.SCALE_MIN_VALUE
            # 鼠标位在图片范围内,则以鼠标位置为中心缩放
            if self.m_scalePixmap.contains(event.pos()):  
                x = self.m_drawPoint.x() - (event.pos().x() - self.m_drawPoint.x())*(self.m_scaleValue/oldScale-1)
                y = self.m_drawPoint.y() - (event.pos().y() - self.m_drawPoint.y())*(self.m_scaleValue/oldScale-1)
                self.m_drawPoint = QPointF(x, y)
            # 鼠标位置不在图片范围内,则以图片中心缩放
            else:   
                x = self.m_drawPoint.x() - (self.m_rectPixmap.width() * (self.m_scaleValue - oldScale)) / 2
                y = self.m_drawPoint.y() - (self.m_rectPixmap.height() * (self.m_scaleValue - oldScale)) / 2
                self.m_drawPoint = QPointF(x, y)
            self.update()

    def paintEvent(self, event):
        if not self.m_rectPixmap.isEmpty():
            painter = QPainter(self)
            painter.setRenderHint(QPainter.SmoothPixmapTransform)
            scaled_pixmap = self.pixmap().scaled(self.pixmap().size() * self.m_scaleValue, Qt.KeepAspectRatio, Qt.SmoothTransformation)
            self.m_scalePixmap = QRectF(scaled_pixmap.rect())
            painter.drawPixmap(self.m_drawPoint, scaled_pixmap)



3.使用方法(将QLabel控件提升为MyLabel)

(1)在当前程序目录下新建MyLabel.py文件,复制粘贴上述程序;

(2)使用Qt Designer进行界面ui设计,对需要显示图片的Label右击,选择提升为...;

(3)在 提升的类名称 和 头文件 两栏中填写MyLabel,依次点击添加和提升,在右侧的对象查看器中可以看到该label对象已经属于自定义的MyLabel类;

(4)为了防止label大小随图片的大小进行变化,在右侧属性编辑器中将label的sizePolicy水平策略和垂直策略均选择Ignored;

(5)在主程序里使用label的set_image()方法进行图片显示,便可以实现图片缩放和拖动功能。

4.效果展示

5.程序参数修改

(1)类属性中定义了图片缩放比例的最大值和最小值,可以根据实际需要进行修改

    # 缩放比例的最小值和最大值
    SCALE_MIN_VALUE = 0.05
    SCALE_MAX_VALUE = 10.0

(2)图片初始显示的比例大小可以在构造方法里进行修改

self.m_scaleValue = 0.25    # 缩放比例初始值

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值