QListWidget实现图片缩略图列表

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

这里项目的原链接:

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

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

下面记录自己学习的过程

(一)示例效果

QListWidget实现图片缩略图列表_第1张图片

(二)代码实例

其中,需要用到的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_())

运行效果如下

QListWidget实现图片缩略图列表_第2张图片

 到此功能实现

你可能感兴趣的:(python,开发语言,qt,人工智能)