pyqt实现图片滚轮缩放与拖拽功能

本文详细描述了一个PythonGUI应用中的eventFilter函数,主要关注于窗口关闭、窗口调整、双击事件放大图片以及鼠标滚轮和拖动事件的处理。展示了如何在QMainWindow中实现图像的放大查看功能,包括使用QImage、QPixmap和QDialog等Qt组件。
摘要由CSDN通过智能技术生成

    def eventFilter(self, obj, event):

        if event.type() == QtCore.QEvent.Close and self.window is obj:

            self.window.removeEventFilter(self)

        elif event.type() == QtCore.QEvent.Resize and self.window is obj:

            print("resize")

        if obj == self.ui.photo1 and event.type() == event.MouseButtonDblClick:

            # 在双击事件中处理放大显示逻辑

            self.showZoomedImage(self.photo_1)

        if obj == self.ui.photo8 and event.type() == event.MouseButtonDblClick:

            # 在双击事件中处理放大显示逻辑

            self.showZoomedImage(self.photo_8)

        if obj == self.ui.photo16 and event.type() == event.MouseButtonDblClick:

            # 在双击事件中处理放大显示逻辑

            self.showZoomedImage(self.photo_16)

        if obj == self.zoomed_label:

            if event.type() == QEvent.Wheel:

                # 捕获到鼠标滚轮事件

                delta = event.angleDelta().y() / 120

                if delta > 0:

                    # 向上滚动,放大图片

                    self.zoomed_label.setPixmap(self.pixmap.scaled(self.zoomed_label.pixmap().size() * 1.1))

                else:

                    # 向下滚动,缩小图片

                    self.zoomed_label.setPixmap(self.pixmap.scaled(self.zoomed_label.pixmap().size() * 0.9))

               

                # 标记需要更新对话框大小

                self.needUpdate = True

                #self.dialog.adjustSize()

               

                return True

            elif event.type() == QEvent.MouseButtonPress:

                # 捕获到鼠标按下事件,记录起始点

                if event.button() == Qt.LeftButton:

                    self.drag_start_pos = event.pos()

                return True

            elif event.type() == QEvent.MouseMove:

                # 捕获到鼠标移动事件,如果有拖动操作则移动图片

                if self.drag_start_pos is not None:

                    delta = event.pos() - self.drag_start_pos

                    self.zoomed_label.move(self.zoomed_label.pos() + delta)

                    self.drag_start_pos = event.pos()

                return True

            elif event.type() == QEvent.MouseButtonRelease:

                # 捕获到鼠标释放事件,清除拖动起始点

                if event.button() == Qt.LeftButton:

                    self.drag_start_pos = None

            elif event.type() == QEvent.MouseButtonDblClick:

                if event.button() == Qt.LeftButton:

                    self.dialog.close()

                return True

       

       

        return super(QMainWindow, self).eventFilter(obj, event)

def showZoomedImage(self, file):

        print("in zoom")

        self.image = QImage(file)

        #self.image = Image.open(file)

        self.pixmap = QPixmap.fromImage(self.image)

        #scaled_pixmap = pixmap.scaled(label.size(), aspectMode=Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation)      

        self.dialog = QDialog(None)

        self.dialog.setWindowTitle("Zoomed Image")

        self.dialog.setModal(True)

        self.dialog.setFixedSize(1000,1000)

        # 创建一个标签用于显示放大后的图片

        #需要放到QScrollArea中不然没显示出来的部分拖拽后还是显示不出来

        scroll_area = QScrollArea(self.dialog)           

        scroll_area.setWidgetResizable(True)

        self.zoomed_label = QLabel(self.dialog)

        self.zoomed_label.setAlignment(Qt.AlignCenter)

        self.zoomed_label.setPixmap(self.pixmap.scaledToWidth(1000, Qt.SmoothTransformation))

        scroll_area.setWidget(self.zoomed_label)

        # 将标签添加到布局中

        layout = QVBoxLayout(self.dialog)

        layout.addWidget(scroll_area)

        self.dialog.setLayout(layout)

        self.zoomed_label.installEventFilter(self)

        self.drag_start_pos = None

        self.dialog.exec_()

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值