PyQt5入门之基于QListWidget版本实现图片缩略图列表功能

作者:虾米小馄饨 时间:2023-07-15 08:32:52 

需求描述

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

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

示例效果

PyQt5入门之基于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实现。

来源:https://blog.csdn.net/Bit_Coders/article/details/120084229

标签:PyQt5,QListWidget,图片缩略图
0
投稿

猜你喜欢

  • python实现ID3决策树算法

    2021-03-15 14:30:13
  • 手把手教你学会HBuilder打包APP

    2022-03-25 00:43:53
  • Python3.6实现连接mysql或mariadb的方法分析

    2024-01-26 19:46:36
  • MySQL 数据库存储和分支

    2011-03-11 19:01:00
  • Tkinter组件实现Radiobutton的示例

    2022-08-01 00:23:24
  • webpack-dev-server自动更新页面方法

    2024-04-19 09:48:10
  • Vue 路由传参加密的示例代码

    2024-05-09 10:50:34
  • 好的产品设计并非始于图片,而是对人的理解

    2009-08-02 20:25:00
  • go和python变量赋值遇到的一个问题

    2023-11-15 01:54:40
  • 收集的ORACLE函数大全

    2010-07-16 12:58:00
  • 剖析Python的Tornado框架中session支持的实现代码

    2022-12-06 17:53:13
  • Linux下MySQL多实例部署及安装指南

    2024-01-21 10:49:28
  • python修改操作系统时间的方法

    2022-10-14 14:13:29
  • python如何修改文件时间属性

    2022-12-04 06:38:24
  • Hello! 404

    2010-09-06 13:37:00
  • 9种python web 程序的部署方式小结

    2021-04-14 10:39:44
  • 一款强大的端到端测试工具Playwright介绍

    2021-06-19 11:59:55
  • 使用SqlBulkCopy时应注意Sqlserver表中使用缺省值的列

    2012-07-11 15:34:35
  • pytorch geometric的GNN、GCN的节点分类方式

    2022-12-24 16:01:23
  • python 制作手机归属地查询工具(附源码)

    2023-07-05 07:02:34
  • asp之家 网络编程 m.aspxhome.com