PyQt实现QListWidget加载文件夹图片并获取选中文件相对路径
解决PyQt5加载文件夹图片并获取选中路径的问题
核心问题修复与功能实现
你的代码存在两个关键问题:一是创建了加载文件名的list1但未添加到布局,导致图片列表无法显示;二是缺少选中项的信号处理逻辑,无法获取选中图片的路径。以下是修改后的完整代码,同时实现你需要的两个功能:
from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * import os app = QApplication([]) main_win = QWidget() main_win.resize(1000, 500) main_win.setWindowTitle('Scuffed Photoshop') # 存储选中图片的相对路径 selected_image_path = "" save_button = QPushButton("SAVE") blur_button = QPushButton("Blur") sharpen_button = QPushButton("sharpen") bw_button = QPushButton("Black & White") # 加载"unedited"文件夹中的图片 image_folder = "unedited" # 自动创建文件夹避免报错 if not os.path.exists(image_folder): os.makedirs(image_folder) image_list = QListWidget() # 筛选常见图片格式,避免加载非图片文件 valid_extensions = ('.png', '.jpg', '.jpeg', '.bmp', '.gif') for filename in os.listdir(image_folder): if filename.lower().endswith(valid_extensions): image_list.addItem(filename) # 处理选中事件,更新路径变量 def update_selected_path(item): global selected_image_path if item: selected_image_path = os.path.join(image_folder, item.text()) # 打印路径用于测试,实际使用可删除 print(f"当前选中图片路径: {selected_image_path}") image_list.itemClicked.connect(update_selected_path) # 布局调整(修复原布局中未加载图片列表的问题) line1 = QVBoxLayout() line2 = QVBoxLayout() line3 = QHBoxLayout() line2_line1 = QHBoxLayout() line2_line2 = QHBoxLayout() # 将图片列表添加到布局中 line3.addWidget(image_list, alignment=Qt.AlignLeft) line2_line2.addWidget(save_button, alignment=Qt.AlignBottom) line2_line2.addWidget(blur_button, alignment=Qt.AlignBottom) line2_line2.addWidget(sharpen_button, alignment=Qt.AlignBottom) line2_line2.addWidget(bw_button, alignment=Qt.AlignBottom) linesV = [line1, line2] line3.addLayout(line2) for layout in linesV: line3.addLayout(layout) line2.addLayout(line2_line1) line2.addLayout(line2_line2) main_win.setLayout(line3) main_win.show() app.exec_()
关键修改说明
- 修复布局显示:将原本未使用的图片列表控件替换为
image_list并添加到主布局,确保图片文件名能正常显示 - 图片格式筛选:添加后缀过滤逻辑,只加载常见图片格式文件
- 路径存储逻辑:定义全局变量
selected_image_path,通过itemClicked信号绑定处理函数,点击列表项时自动拼接并更新相对路径 - 容错处理:自动创建不存在的
unedited文件夹,避免程序启动报错
进阶优化建议
如果后续功能扩展,建议改用类结构实现,避免全局变量,代码更易维护:
from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * import os class MiniPhotoshop(QWidget): def __init__(self): super().__init__() self.selected_image_path = "" self.setup_ui() def setup_ui(self): self.resize(1000, 500) self.setWindowTitle('Scuffed Photoshop') # 按钮创建 save_btn = QPushButton("SAVE") blur_btn = QPushButton("Blur") sharpen_btn = QPushButton("sharpen") bw_btn = QPushButton("Black & White") # 图片列表加载 image_folder = "unedited" if not os.path.exists(image_folder): os.makedirs(image_folder) self.image_list = QListWidget() valid_ext = ('.png', '.jpg', '.jpeg', '.bmp', '.gif') for fname in os.listdir(image_folder): if fname.lower().endswith(valid_ext): self.image_list.addItem(fname) self.image_list.itemClicked.connect(self.on_item_selected) # 布局搭建 main_layout = QHBoxLayout() btn_layout = QVBoxLayout() btn_row = QHBoxLayout() main_layout.addWidget(self.image_list, alignment=Qt.AlignLeft) btn_row.addWidget(save_btn, alignment=Qt.AlignBottom) btn_row.addWidget(blur_btn, alignment=Qt.AlignBottom) btn_row.addWidget(sharpen_btn, alignment=Qt.AlignBottom) btn_row.addWidget(bw_btn, alignment=Qt.AlignBottom) btn_layout.addLayout(QHBoxLayout()) # 空布局占位 btn_layout.addLayout(btn_row) main_layout.addLayout(btn_layout) main_layout.addLayout(QVBoxLayout()) # 空布局占位 self.setLayout(main_layout) def on_item_selected(self, item): if item: self.selected_image_path = os.path.join("unedited", item.text()) print(f"选中图片路径: {self.selected_image_path}") if __name__ == "__main__": app = QApplication([]) window = MiniPhotoshop() window.show() app.exec_()
内容的提问来源于stack exchange,提问作者RaptoRR
相关产品推荐
相关产品推荐

