1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| """ 自定义CustomLabel类实现指定鼠标位置滚轮缩放,鼠标拖动 QLabel功能调试 """ from PyQt5.QtGui import QImage, QPixmap, QIcon, QColor, QWheelEvent, QMouseEvent from PyQt5.QtCore import pyqtSlot, QSize, Qt, pyqtSignal, QEvent from PyQt5.QtWidgets import QApplication, QTextBrowser, QWidget, QLabel, QPushButton, QFileDialog, QFrame, QMessageBox, \ QListWidgetItem, QSizePolicy, QListWidget, QScrollArea from PyQt5.Qt import QPainter, QPoint
class CustomLabel(QLabel): def __init__(self, parent): super().__init__(parent) self.setMouseTracking(True) self.img = None self.scaled_img = None self.start_pos = None self.end_pos = None self.left_click = False self.wheel_flag = False
self.scale = 1 self.old_scale = 1 self.point = QPoint(0, 0) self.rb_point = QPoint(0, 0) self.old_rb_point = QPoint(0, 0) self.x = -1 self.y = -1 self.new_height = -1 self.new_width = -1
def set_image(self, img): self.img = img width, height = self.img.width(), self.img.height() self.img = self.img.scaled(width, height, Qt.KeepAspectRatio) self.scaled_img = self.img
self.new_height = height self.new_width = width self.scale = 1
def paintEvent(self, e): if self.scaled_img: painter = QPainter() painter.begin(self) painter.scale(self.scale, self.scale) if self.wheel_flag: self.wheel_flag = False this_left_x = self.point.x() * self.old_scale this_left_y = self.point.y() * self.old_scale
this_scale_width = self.new_width * self.old_scale this_scale_height = self.new_height * self.old_scale
gap_x = self.x - this_left_x gap_y = self.y - this_left_y
if 0 < gap_x < this_scale_width and 0 < gap_y < this_scale_height: new_left_x = int(self.x / self.scale - gap_x / self.old_scale) new_left_y = int(self.y / self.scale - gap_y / self.old_scale)
self.point = QPoint(new_left_x, new_left_y) self.rb_point = QPoint(new_left_x + this_scale_width, new_left_y + this_scale_height)
painter.drawPixmap(self.point, self.scaled_img) painter.end()
def wheelEvent(self, event): angle = event.angleDelta() / 8 angleY = angle.y() self.old_scale = self.scale self.x, self.y = event.x(), event.y() self.wheel_flag = True if angleY > 0: self.scale *= 1.05 else: self.scale *= 0.95 if self.scale < 1: self.scale = 1 self.adjustSize() self.update()
def mouseMoveEvent(self, e): if self.left_click: self.end_pos = e.pos() - self.start_pos lt_new_point = self.point + self.end_pos / self.scale
rb_new_point2 = self.rb_point + self.end_pos / self.scale
if lt_new_point.x() > 0: lt_new_point.setX(0) if lt_new_point.y() > 0: lt_new_point.setY(0)
def mousePressEvent(self, e): if e.button() == Qt.LeftButton: self.left_click = True self.start_pos = e.pos()
def mouseReleaseEvent(self, e): if e.button() == Qt.LeftButton: self.left_click = False
|