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 # 缩放比例初始值