python pyqt制作一个好像图片查看器那样,显示图片,能按住ctrl滑动滚轮放大缩小查看图片 框选矩形获取坐标等功能
时间: 2024-05-04 16:19:04 浏览: 165
可以使用 PyQt5 中的 QGraphicsView 和 QGraphicsScene 实现这个功能。以下是一个简单的示例代码:
```python
import sys
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QPixmap, QPen, QColor
from PyQt5.QtCore import Qt
class ImageViewer(QGraphicsView):
def __init__(self):
super().__init__()
# 创建场景
self.scene = QGraphicsScene()
self.setScene(self.scene)
# 加载图片
self.image = QPixmap('image.jpg')
self.scene.addPixmap(self.image)
# 设置滚动条策略
self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.setDragMode(QGraphicsView.ScrollHandDrag)
# 设置缩放策略
self.setRenderHint(QPixmap.Antialiasing)
self.setRenderHint(QPixmap.SmoothTransformation)
self.setRenderHint(QPixmap.HighQualityAntialiasing)
self.setInteractive(True)
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
# 画笔和矩形框
self.pen = QPen(QColor(255, 0, 0, 128))
self.rect = None
self.start_pos = None
def wheelEvent(self, event):
# 按住 Ctrl 键滚动鼠标滚轮进行缩放
if event.modifiers() == Qt.ControlModifier:
delta = event.angleDelta().y()
factor = 1.1 if delta > 0 else 0.9
self.scale(factor, factor)
else:
super().wheelEvent(event)
def mousePressEvent(self, event):
# 按下鼠标左键开始框选矩形
if event.button() == Qt.LeftButton:
self.start_pos = event.pos()
def mouseMoveEvent(self, event):
# 移动鼠标更新框选矩形
if self.start_pos is not None:
if self.rect is not None:
self.scene.removeItem(self.rect)
self.rect = self.scene.addRect(self.start_pos.x(),
self.start_pos.y(),
event.pos().x() - self.start_pos.x(),
event.pos().y() - self.start_pos.y(),
self.pen)
def mouseReleaseEvent(self, event):
# 松开鼠标左键结束框选矩形并输出坐标
if event.button() == Qt.LeftButton:
if self.rect is not None:
self.scene.removeItem(self.rect)
self.rect = self.scene.addRect(self.start_pos.x(),
self.start_pos.y(),
event.pos().x() - self.start_pos.x(),
event.pos().y() - self.start_pos.y(),
self.pen)
print(self.rect.boundingRect().x(),
self.rect.boundingRect().y(),
self.rect.boundingRect().width(),
self.rect.boundingRect().height())
self.start_pos = None
if __name__ == '__main__':
app = QApplication(sys.argv)
viewer = ImageViewer()
viewer.show()
sys.exit(app.exec_())
```
在这个示例中,我们创建了一个 ImageViewer 类,并在其中添加了 QGraphicsView 和 QGraphicsScene。我们加载了一张图片并将其添加到场景中。然后我们设置了滚动条和缩放策略,并重载了鼠标事件来实现矩形框选和输出坐标的功能。最后我们创建了一个 QApplication 并展示了 ImageViewer。
阅读全文