PyQt5入门——QListWidget实现图片缩略图列表

本文介绍了一个基于QListWidget的图像查看工具的实现,通过创建自定义的ImageListWidget展示图片缩略图,点击缩略图可在右侧预览大图。代码示例展示了如何加载图片路径到列表并响应选中变化。为了优化性能,实际应用中建议异步加载图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求描述

最近在写一个图像标注小工具,其中需要用到一个缩略图列表,来查看文件夹内的图片文件。

这里整理一个基于QListWidget实现的版本,简单可用。

示例效果

在这里插入图片描述

代码示例

QListWidget官方文档:[link]

其中,需要用到的QListWidget信号:

  • itemSelectionChanged:所选项发生变化时发送。

先定义缩略图列表部分,继承自QListWidget。每个QListWidgetItem可以设置QIcon图片和文本。

import os
from qtpy.QtCore import QSize
from qtpy.QtGui import QIcon,QPixmap
from PyQt5.QtWidgets import QListWidget,QListWidgetItem,QListView,QWidget,QApplication,QHBoxLayout,QLabel

class ImageListWidget(QListWidget):
    def __init__(self):
        super(ImageListWidget, self).__init__()
        self.setFlow(QListView.Flow(1))#0: left to right,1: top to bottom
        self.setIconSize(QSize(150,100))

    def add_image_items(self,image_paths=[]):
        for img_path in image_paths:
            if os.path.isfile(img_path):
                img_name = os.path.basename(img_path)
                item = QListWidgetItem(QIcon(img_path),img_name)
                # item.setText(img_name)
                # item.setIcon(QIcon(img_path))
                self.addItem(item)

再来简单布局下窗体控件:

左边区域用QLabel加载图像,右边区域是图片缩略图列表,点击缩略图,可以在左边查看大图。

class ImageViewerWidget(QWidget):
    def __init__(self):
        super(QWidget, self).__init__()
        # 显示控件
        self.list_widget = ImageListWidget()
        self.list_widget.setMinimumWidth(200)
        self.show_label = QLabel(self)
        self.show_label.setFixedSize(600,400)
        self.image_paths = []
        self.currentImgIdx = 0
        self.currentImg = None

        # 水平布局
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.show_label)
        self.layout.addWidget(self.list_widget)

        # 信号与连接
        self.list_widget.itemSelectionChanged.connect(self.loadImage)

    def load_from_paths(self,img_paths=[]):
        self.image_paths = img_paths
        self.list_widget.add_image_items(img_paths)

    def loadImage(self):
        self.currentImgIdx = self.list_widget.currentIndex().row()
        if self.currentImgIdx in range(len(self.image_paths)):
            self.currentImg = QPixmap(self.image_paths[self.currentImgIdx]).scaledToHeight(400)
            self.show_label.setPixmap(self.currentImg)

加载一些图片路径,并运行窗口:

if __name__=="__main__":
    import sys
    app = QApplication(sys.argv)

    # 图像路径
    img_dir = r"E:\Pic"
    filenames = os.listdir(img_dir)
    img_paths=[]
    for file in filenames:
        if file[-4:]==".png" or file[-4:]==".jpg":
            img_paths.append(os.path.join(img_dir,file))

    # 显示控件
    main_widget = ImageViewerWidget()
    main_widget.load_from_paths(img_paths)
    main_widget.setWindowTitle("ImageViewer")
    main_widget.show()

    # 应用程序运行
    sys.exit(app.exec_())

小结

  • 上面代码只是一个实现思路,实际应用中最好另开一个线程加载图片,并且随着滚动条下拉,再不断加载缓存。
  • QListWidget可以实现简单的图标+文字列表,如果列表项中涉及自定义控件和其他操作逻辑,建议采用QListView和Model实现。
要在PyQtQListWidget中显示图片,可以通过以下步骤实现: 1. 首先,创建一个自定义的QListWidget部件,继承自QListWidget类,并定义一个add_image_items方法,用于添加图片项。 2. 在add_image_items方法中,遍历图片路径列表,并使用os.path.isfile函数来确保路径指向的是一个文件。然后,使用QListWidgetItem类创建一个项,并通过setIcon和setText方法设置项的图标和文本。 3. 调用addItem方法将项添加到QListWidget中。 4. 在主程序中,创建一个ImageListWidget实例,并调用其add_image_items方法,传入要显示的图片路径列表5. 最后,将ImageListWidget实例添加到窗口布局中,以显示图片。 以下是一个示例代码,演示如何使用PyQtQListWidget显示图片: ```python import os from qtpy.QtCore import QSize from qtpy.QtGui import QIcon from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QListView, QWidget, QApplication, QHBoxLayout, QLabel class ImageListWidget(QListWidget): def __init__(self): super(ImageListWidget, self).__init__() self.setFlow(QListView.TopToBottom) # 设置为从上到下排列 self.setIconSize(QSize(150, 100)) # 设置图标的大小为150x100 def add_image_items(self, image_paths=[]): for img_path in image_paths: if os.path.isfile(img_path): img_name = os.path.basename(img_path) item = QListWidgetItem(QIcon(img_path), img_name) self.addItem(item) # 创建应用程序和窗口 app = QApplication([]) window = QWidget() layout = QHBoxLayout(window) # 创建并添加图片列表部件 image_list_widget = ImageListWidget() image_list_widget.add_image_items(["path/to/image1.jpg", "path/to/image2.jpg", "path/to/image3.jpg"]) layout.addWidget(image_list_widget) window.show() app.exec_() ``` 这段代码创建了一个ImageListWidget部件,继承自QListWidget,然后在add_image_items方法中添加了要显示的图片项。最后,将ImageListWidget部件添加到窗口布局中,通过执行应用程序来显示窗口。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PyQt5入门——QListWidget实现图片缩略图列表](https://blog.youkuaiyun.com/Bit_Coders/article/details/120084229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Qt5.9中使用列表控件QListWidget显示缩略图(完全模仿Windows图片视图文档)](https://blog.youkuaiyun.com/naibozhuan3744/article/details/81070068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值