使用pyqt写一个放大镜功能
时间: 2024-03-15 07:34:20 浏览: 293
使用 PyQt5 写的 Udp Client 的例程
下面是一个简单的使用PyQt实现放大镜功能的例子:
```python
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QPixmap, QPainter, QCursor
class Magnifier(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TransparentForMouseEvents)
self._zoom = 2.0
self._pixmap = None
def setPixmap(self, pixmap):
self._pixmap = pixmap
def setZoomFactor(self, zoom):
self._zoom = zoom
def paintEvent(self, event):
if self._pixmap is None:
return
painter = QPainter(self)
painter.setRenderHint(QPainter.SmoothPixmapTransform)
center = self.rect().center()
source_rect = QRect(
center.x() / self._zoom - center.x(),
center.y() / self._zoom - center.y(),
self.width() / self._zoom,
self.height() / self._zoom
)
target_rect = QRect(0, 0, self.width(), self.height())
painter.drawPixmap(target_rect, self._pixmap, source_rect)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.close()
class Widget(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel(self)
self.label.setPixmap(QPixmap("image.jpg"))
self.magnifier = Magnifier(self)
self.magnifier.setZoomFactor(4.0)
self.label.setMouseTracking(True)
self.label.mouseMoveEvent = self.mouseMoveEvent
def mouseMoveEvent(self, event):
if not self.label.rect().contains(event.pos()):
self.magnifier.close()
return
if self.magnifier.isVisible():
self.magnifier.move(QCursor.pos() + QPoint(20, 20))
else:
self.magnifier.setPixmap(self.label.pixmap().copy())
self.magnifier.show()
self.magnifier.move(QCursor.pos() + QPoint(20, 20))
if __name__ == '__main__':
app = QApplication([])
w = Widget()
w.show()
app.exec_()
```
在这个例子中,我们创建了一个 `Magnifier` 类来实现放大镜功能。它继承自 `QWidget` 并设置了一些属性,比如窗口无边框、鼠标穿透等。在 `paintEvent` 方法中,我们根据当前鼠标位置和缩放因子来绘制放大镜的内容。在 `mousePressEvent` 方法中,我们关闭放大镜窗口。
在主窗口中,我们创建了一个 `QLabel` 来显示图像,并且使用 `setMouseTracking` 方法来启用鼠标跟踪功能。在 `mouseMoveEvent` 方法中,我们判断鼠标是否在 `QLabel` 区域内,并且根据当前鼠标位置来显示或者隐藏放大镜窗口。
阅读全文