QListWidget实现图片缩略图列表

该文章介绍了如何利用PyQt5的QListWidget和QLabel来实现图片缩略图的展示,当选择不同的缩略图时,会在右侧显示大图。主要涉及QListWidget的itemSelectionChanged信号以及QPixmap的使用。
摘要由CSDN通过智能技术生成

最近在学PyQt,跟着一个博主学做一个缩略图列表,来查看文件夹内的图片文件

这里项目的原链接:

PyQt5入门——QListWidget实现图片缩略图列表_pyqt5 图片列表_虾米小馄饨的博客-CSDN博客

在此感谢原博主的高质量文章

下面记录自己学习的过程

(一)示例效果

(二)代码实例

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

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

(1)先定义缩略图列表部分

继承自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
# 定义缩略图列表部分,继承自QListWidget。每一个QListWidgetItem可以设置QIcon图片和文本
class ImageListWidget(QListWidget):
    # def__init__(self):  用于初始化类,只有一个self,指的是实例本身
    def __init__(self):
        # super()用来调用父类(基类)的方法,__init__()是类的构造方法
        # super().__init__() 就是调用父类的init方法, 同样可以使用super()去调用父类的其他方法
        super(ImageListWidget, self).__init__()
        # setFlow 布局方向设定
        # QListView类用于展示数据,它的子类是QListWidget
        self.setFlow(QListView.Flow(1))  # 0: left to right, 1: top to bottom
        # setIconSize改变单元格中图片的尺寸
        self.setIconSize(QSize(150, 100))

    def add_image_items(self, image_paths=[]):
        for img_path in image_paths:
            # os.path.isfile():判断某一对象(需提供绝对路径)是否为文件
            # os.path.isdir():判断某一对象(需提供绝对路径)是否为目录
            if os.path.isfile(img_path):
                # os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
                # os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
                img_name = os.path.basename(img_path)
                # QListWidgetItem类为QListWidget类提供构成QListWidget列表部件的项,每个列表部件的项都是一个QListWidgetItem对象
                # QIcon类提供了处于不同模式和状态下的可缩放图标。QIcon可以从给定的一组像素图生成较小,较大,激活和禁用等情况小的像素图。Qt窗口部件使用这些像素图来显示代表特定动作的图标。
                item = QListWidgetItem(QIcon(img_path), img_name)
                # item.setText(img_name)
                # item.setIcon(QIcon(img_path))
                self.addItem(item)

(2)布局窗体控件

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

# 布局窗体控件
# 左边区域用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)
        # 使用setFixedSize()这个函数的话不能最大化窗口(窗口最大化的按钮会变成灰色),默认不可进行缩小放大,即窗口为确定大小。
        self.show_label.setFixedSize(600, 400)
        self.image_paths = []
        self.currentImgIdx = 0
        self.currentImg = None

        # 水平布局
        # 采用QBOXLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和QVBoxLayout类继承自QBoxLayout
        # 采用QHBoxLayout类,按照从左到右的顺序来添加控件
        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_path=[]):
        self.image_paths = img_paths
        self.list_widget.add_image_items(img_paths)

    def loadImage(self):
        """
        在Qt5的QTabWidget类中,在默认情况下是以0开始作为标签索引值,而currentIndex()函数返回的值指的是
        在当前的页面切换的界面中所停留的那一个页面对应的标签索引值。
        currentIndex().row()可以获取当前点击单元格所在的行序号,currentIndex().column()可以获取当前点击单元格所在的列序号。
        currentIndex().data()可以获取到当前点击单元格的文本;
        """
        self.currentImgIdx = self.list_widget.currentIndex().row()
        if self.currentImgIdx in range(len(self.image_paths)):
            """
            QPixmap类用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中,
            通常是标签或者按钮,用于在标签或按钮上显示图像
            QPixmap可以读取的图像文件类型有BMP,GIF,JPG等
            """
            self.currentImg = QPixmap(self.image_paths[self.currentImgIdx]).scaledToHeight(400)
            # setPixmap函数显示图片
            self.show_label.setPixmap(self.currentImg)

(3)加载一些图片路径,并运行窗口

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    # 图像路径
    img_dir = r"D:\Qt\QtData\PyQt\Thumbnail\picture"
    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_())

运行效果如下

 到此功能实现

QListWidgetQt框架中的一个控件,用于在用户界面中显示一个可滚动的列表。要显示图片,可以通过QListWidget的addItem方法添加一个QListWidgetItem对象,然后通过setItemWidget方法将QListWidgetItem与一个QWidget对象关联起来。这个QWidget对象可以是一个QLabel,用于显示图片。 首先,我们需要创建一个QListWidget对象: QListWidget *listWidget = new QListWidget(this); 然后,我们可以通过循环遍历的方式,将多个图片文件添加到QListWidget中: QStringList imageFiles; // 存放图片文件路径的列表 imageFiles << "image1.jpg" << "image2.jpg" << "image3.jpg"; foreach(QString file, imageFiles){ QListWidgetItem *item = new QListWidgetItem(); // 创建一个QLabel用于显示图片 QLabel *label = new QLabel(); QPixmap pixmap(file); label->setPixmap(pixmap.scaled(100, 100)); // 设置图片大小为100x100 // 将QLabel与QListWidgetItem关联起来 listWidget->setItemWidget(item, label); // 添加QListWidgetItem到QListWidgetlistWidget->addItem(item); } 最后,将这个QListWidget添加到窗口中的布局中: QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(listWidget); setLayout(layout); 上述代码中,我们假设存在三个图片文件image1.jpg、image2.jpg、image3.jpg,将它们分别添加到QListWidget中,并调整显示大小为100x100。最后,将QListWidget添加到窗口的布局中。这样,运行程序后,我们就可以在窗口中看到一个列表列表中的每个项显示了一张图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值