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