pyqt5 qlabel中设置图片,右键qlabel后显示菜单,点击查看大图后,出现界面显示放大后图片,通过滚轮能够放大或缩小图片,通过鼠标左键拖动可以移动图片
时间: 2024-03-02 09:53:23 浏览: 202
您可以通过以下代码实现在 Pyqt5 的 QLabel 中设置图片,在右键菜单中添加查看大图选项,并通过滚轮缩放图片,通过鼠标拖动移动图片:
```python
from PyQt5.QtGui import QPixmap, QTransform
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QLabel, QMenu, QAction, QDialog
class ImageLabel(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
self.setScaledContents(True)
self.setMinimumSize(300, 300)
self.setAlignment(Qt.AlignCenter)
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.show_menu)
self.origin_pixmap = None
def set_image(self, image_path):
self.origin_pixmap = QPixmap(image_path)
self.setPixmap(self.origin_pixmap)
def show_menu(self, pos):
menu = QMenu(self)
action = QAction("查看大图", self)
action.triggered.connect(self.show_image)
menu.addAction(action)
menu.exec_(self.mapToGlobal(pos))
def show_image(self):
dialog = QDialog(self)
dialog.setWindowTitle("放大后的图片")
dialog.setMinimumSize(800, 600)
label = QLabel(dialog)
label.setAlignment(Qt.AlignCenter)
label.setScaledContents(True)
label.setPixmap(self.origin_pixmap)
label.installEventFilter(self)
dialog.exec_()
def wheelEvent(self, event):
if event.angleDelta().y() > 0:
self.zoom(1.1)
else:
self.zoom(0.9)
def zoom(self, factor):
transform = QTransform()
transform.scale(factor, factor)
self.setPixmap(self.origin_pixmap.transformed(transform))
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.origin_pos = event.pos()
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
delta = event.pos() - self.origin_pos
self.move(self.pos() + delta)
def eventFilter(self, obj, event):
if event.type() == Qt.Wheel:
if event.angleDelta().y() > 0:
self.zoom(1.1)
else:
self.zoom(0.9)
return True
return super().eventFilter(obj, event)
```
在这个代码中,我们创建了一个 ImageLabel 类,继承了 QLabel,并重写了 wheelEvent、mousePressEvent、mouseMoveEvent 以及 eventFilter 函数,实现了在 QLabel 中显示图片并支持缩放、移动等功能。
具体实现方式是:
1. 在 set_image 函数中,我们设置了 QLabel 的图片,并保留了原始图片的 QPixmap。
2. 在 show_menu 函数中,我们创建了一个查看大图的右键菜单,并将其与 QLabel 相关联。
3. 在 show_image 函数中,我们创建了一个 QDialog,将原始图片设置到 QLabel 中,并将其与 ImageLabel 相关联。
4. 在 wheelEvent 函数中,我们根据鼠标滚轮事件的方向来计算缩放因子,并将原始图片使用变换函数进行缩放。
5. 在 mousePressEvent 和 mouseMoveEvent 函数中,我们记录了鼠标左键按下时的位置,并在鼠标移动事件中计算鼠标位移,从而实现了图片的移动功能。
6. 在 eventFilter 函数中,我们通过过滤 QDialog 中的鼠标滚轮事件来实现在放大后的图片中支持缩放功能。
最后,我们可以使用以下代码来创建一个窗口,并在其中添加一个 ImageLabel,并设置图片:
```python
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
import sys
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
image_label = ImageLabel(window)
image_label.set_image("your_image_path")
layout.addWidget(image_label)
window.show()
sys.exit(app.exec_())
```
这样就完成了在 Pyqt5 的 QLabel 中设置图片,在右键菜单中添加查看大图选项,并通过滚轮缩放图片,通过鼠标拖动移动图片的功能。
阅读全文