当前位置:   article > 正文

pyqt5改写wheelEvent实现ctrl+鼠标滑轮预览缩放图片,持续优化中!!!附上纯手工最全中文注释_pyqt5 鼠标滚动事件 图片放大 缩小 移动

pyqt5 鼠标滚动事件 图片放大 缩小 移动
  1. import os
  2. import sys
  3. from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QFileDialog, QScrollArea,QHBoxLayout
  4. from PyQt5.QtGui import QPixmap, QImageReader
  5. from PyQt5.QtCore import Qt
  6. class ImageViewer(QMainWindow):
  7. def __init__(self):
  8. super().__init__()
  9. self.initUI()
  10. def initUI(self):
  11. self.setWindowTitle('图片浏览器') # 设置窗口标题
  12. self.setGeometry(100, 100, 800, 600) # 设置窗口位置和大小
  13. self.central_widget = QWidget(self)#创建一个QWidge对象并命名为中心部件
  14. self.setCentralWidget(self.central_widget)#把上面设的那个设为中心部件,会显示在视窗的中心部分
  15. self.scroll_area = QScrollArea(self.central_widget) # 创建滚动区域,()里面的操作是为了让这个滚动区域为中心部件的小部件,不单独显示
  16. self.scroll_area.setWidgetResizable(True) # 设置滚动区域可调整大小WidgetResizable设置为True之后将允许区域内的小部件自动调整大小,以适应滚动区域的大小。
  17. self.central_widget_layout = QVBoxLayout(self.central_widget) # 创建垂直布局
  18. self.central_widget_layout.addWidget(self.scroll_area)
  19. self.image_widget = QWidget() # 创建用于显示图像的widget
  20. self.scroll_area.setWidget(self.image_widget)#将显示图像加入到滚动区域中以适应滚动区域的图片读取
  21. self.image_layout = QHBoxLayout(self.image_widget) # 在widget中创建水平布局,用于放置图像
  22. self.image_layout.setAlignment(Qt.AlignLeft | Qt.AlignTop) # 图像从左向右水平展示,上对齐显示
  23. self.browse_button = QPushButton('选择文件夹', self.central_widget) # 创建一个按钮用于选择文件夹
  24. self.browse_button.clicked.connect(self.browse_folder) # 将按钮点击事件连接到选择文件夹的方法,信号和槽,当这个broswse被点击的时候,下面那个函数就会被调用
  25. self.central_widget_layout.addWidget(self.browse_button) # 将选择文件夹按钮添加到垂直布局中
  26. self.image_paths = [] # 用于存储选择文件夹内的图像文件路径的列表
  27. self.current_image_index = 0 # 当前显示的图像索引
  28. self.scale_factor = 1.0 # 当前图像的缩放因子
  29. self.show_current_image()
  30. def browse_folder(self):
  31. options = QFileDialog.Options()#这里创建options是一个空选项,可以之后在options里面设置一些新的选项,比如对话框显示模式、过滤文件类型等操作,在下面一步传入这个options就可以达到效果了
  32. folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹", options=options) # 打开文件夹选择对话框,getExistingDirectory这个打开之后返回文件夹路径
  33. if folder_path:
  34. self.load_images_from_folder(folder_path) # 加载选择文件夹内的所有图像
  35. self.show_current_image() # 在窗口中显示图像
  36. def load_images_from_folder(self, folder_path):
  37. self.image_paths = []#创建一个空列表用于存储文件的路径
  38. # 过滤出文件夹及其子文件夹中的图像文件路径
  39. for root, dirs, files in os.walk(folder_path):#用os.wlak遍历文件夹中所有文件和子文件夹,返回的root是当前文件夹路径,dirs是子文件夹列表,files是文件列表
  40. for file in files:
  41. # if QImageReader.imageFormat(file) != b'':
  42. self.image_paths.append(os.path.join(root, file))#将root和file链接起来得到完整路径
  43. def show_current_image(self):
  44. # 清空图像布局中的所有图像
  45. while self.image_layout.count():
  46. item = self.image_layout.takeAt(0)
  47. if item.widget():
  48. item.widget().deleteLater()
  49. if not self.image_paths:
  50. # 如果没有图像可显示,则显示默认消息
  51. self.image_label = QLabel("没有可显示的图像。")
  52. self.image_layout.addWidget(self.image_label)
  53. return
  54. # 在图像布局中添加所有图像
  55. for image_path in self.image_paths:
  56. image_label = QLabel()#创建一个空Qlabel用于显示图像
  57. pixmap = QPixmap(image_path)#Qpixmap将数据转成图像方式,但他不能直接在界面上显示图像,需要将他设置为Qlabel里的一个部件,就可以显示了,
  58. scaled_pixmap = pixmap.scaledToHeight(self.central_widget.height() * self.scale_factor, Qt.SmoothTransformation)#这个乘法作用是通过高度和缩放比例来缩放图像,smooth是用平滑的方式
  59. image_label.setPixmap(scaled_pixmap)#这里就是将Qpixmap做缩放处理后设置为一个Qlabel部件
  60. self.image_layout.addWidget(image_label)
  61. def wheelEvent(self, event):
  62. # 处理鼠标滚轮事件来实现图像的缩放
  63. if event.modifiers() == Qt.ControlModifier:#检查是否同时按下了ctrl键
  64. num_degrees = event.angleDelta().y() / 8#QWheelEvent中的一个用法就是angleDelta().y(),其中angleDelta()表述返回一个Qpoint,代表滚轮方向和步数,y是滚轮垂直方向上的偏移
  65. num_steps = num_degrees / 15 # 每一步对应一个15度的旋转
  66. # 调整当前缩放因子
  67. self.scale_factor *= 1.2 ** num_steps #每步1.2的倍率来调整缩放因子
  68. # 确保缩放因子在合理范围内
  69. self.scale_factor = min(max(self.scale_factor, 0.1), 10)
  70. self.show_current_image()
  71. if __name__ == '__main__':
  72. app = QApplication(sys.argv)
  73. viewer = ImageViewer()
  74. viewer.show()
  75. sys.exit(app.exec_())

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/100701
推荐阅读
相关标签
  

闽ICP备14008679号