PyQt5:自定义QListView显示

news2025/1/6 9:08:00
  • item显示索引号
  • 添加图标
  • 绘制图形
  • 设置文本样式

ListView 是一个基于模型-视图(Model-View)架构的控件,它通常用于显示大量的数据项。与 QListWidget 不同,QListView 不直接管理数据项的内容,而是通过一个数据模型(如 QStringListModel、QStandardItemModel 或自定义模型)来提供数据。若需要自定义 QListView 的每个item外观显示,需要自定义一个委托(QStyledItemDelegate 或 QItemDelegate)来绘制和编辑项。
QStyledItemDelegate类为模型中的数据项提供显示和编辑功能,通过重写paint()方法来绘制指定item的样式(背景、文字颜色、边框、图标)。

创建列表视图

#创建listview
import sys
from PyQt5 import QtCore, QtWidgets

class Ui_Dialog(object):
    def __init__(self):
        self.FormData=FormData()#listview控件数据处理
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.listView = QtWidgets.QListView(Dialog)
        self.listView.setGeometry(QtCore.QRect(20, 20, 361, 261))
        self.listView.setObjectName("listView")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

listview添加item

数据模型 QStringListModel与QStandardItemModel 区别

QStringListModel和QStandardItemModel都是Qt中用于处理字符串列表的模型类。QStringListModel是专门为QStringList设计的,而QStandardItemModel提供了更高级的功能,如每个条目可以有多个数据角色(例如,可以有一个显示在视图中的文本,另一个存储后台数据)。QStringListModel通常用于简单的字符串列表显示,而QStandardItemModel更灵活,适用于更复杂的需求

class FormData:
    @staticmethod
    def addStringModel(data:list, obj):#用于简单的字符串列表显示
        model = QtCore.QStringListModel()  # 创建数据模型
        model.setStringList(data)  # 模型添加数据
        obj.setModel(model)  #将模型设置到 QListView
    #listview item绑定额外数据
    @staticmethod
    def addStandModel(data:str,info,obj):#添加视图中的文本数据和存储在后台的数据(不显示)	
    	model = QStandardItemModel()# 创建一个 QStandardItemModel
    	obj.setModel(model)# 将模型关联到 QListView
    	item = QStandardItem()
    	# 添加额外信息
        if isinstance(info,list):#多中额外信息
            for i,value in enumerate(info):
                item.setData(value, role=Qt.UserRole+i+1)
        else:
            item.setData(info, role=Qt.UserRole+1)#infor:可以为字典,字符串等数据存储在后台
        #Qt.DisplayRole: 这是默认角色,用于显示文本或图标。Qt.DecorationRole: 用于设置图标。Qt.UserRole: 开始用于应用程序特定数据的自定义角色。
		#添加默认文本内容
        if bool(data):
            item.setText(data,role=Qt.DisplayRole)
    	# 添加数据到模型
    	obj.model().appendRow(QStandardItem(item))#listview末尾添加   
		

#listview添加多个item
self.FormData.addStringModel(['a','b','c'],self.listview)
#listview item 绑定额外数据
self.FormData.QStandardItemModel('a',['A','ascill值'],self.listview)
  • item显示索引号
  • 添加图标
  • 绘制图形
  • 设置文本样式

listview 每个item 绘制索引号和额外信息

重写QStyledItemDelegate类的pain方法,自定义item显示内容(索引号+额外文本,默认文本)

class PaintItem(QStyledItemDelegate):#
    def paint(self, painter, option, index):
        # 获取itme默认文本数据
        # text = index.data(Qt.DisplayRole)
        #******************绘制额外文本********************************
        index_number = index.row() + 1# 获取当前项的索引号,int
        info=index.data(Qt.UserRole+1)#额外文本
        content=str(index_number)+' '+info+':'
        # 设置索引号位置、尺寸
        index_rect = option.rect.adjusted(0, 0, 0, 0)  # left,top,width,height
        # 绘制额外文本:索引号
        painter.drawText(index_rect, Qt.AlignLeft | Qt.AlignVCenter, content)
        # 获取索引号文本的尺寸
        font_metrics = QFontMetrics(painter.font())
        text_width = font_metrics.width(content)
        # ******************绘制默认文本********************************
        # 设置默认文本的位置,防止与索引号重叠
        option.rect.setX(text_width+5)
        # 绘制默认文本
        super(PaintItem, self).paint(painter, option, index)

listview添加代理,自定义显示内容

#设置项代理为自定义的IndexDelegate
delegate = PaintItem()
self.listview.setItemDelegate(delegate)

listview 每个item 添加图标、背景、文本颜色、边框

#自定义代理类:自定义委托,重写paint()方法来绘制指定item的样式(背景、文字颜色、边框、图标)
class PaintItem(QStyledItemDelegate):
    def __init__(self,spriteData=None,pixmap=None,addIcon=False):
        super().__init__()
        self.spriteData=spriteData#精灵图
        self.pixmap=pixmap#
        self.addIcon=addIcon#item是否添加图标
    #绘制、显示item样式
    def paint(self, painter, option, index):
        # 保存painter的当前配置
        painter.save()
        #绘制图标
        idd=index.data(Qt.UserRole+1)
        imgData = self.spriteData[idd]
        # 从精灵图中提取指定位置、大小的图片
        sprite_pixmap = self.pixmap.copy(imgData['x'], imgData['y'], imgData['w'], imgData['h'])
        sprite_pixmap=sprite_pixmap.scaled(16, 16, Qt.KeepAspectRatio)  # 设置图片大小为21x21
        icon = QtGui.QIcon(sprite_pixmap)
        # icon=icon.pixmap(21, 21)
        # 绘制图标
        icon.paint(painter, option.rect, Qt.AlignLeft | Qt.AlignVCenter)
        #**************设置item背景色、边框和文本颜色****************
        # 获取item的数据
        item_text = index.data(Qt.DisplayRole)#index.data(Qt.UserRole)
        background_color = QtGui.QColor(36,36,36)
        text_color = QtGui.QColor(255, 255, 255)  # 白色文本
        #绘制背景
        painter.fillRect(option.rect, background_color)#painter.fillRect(option.rect, background_color)
        # 设置文本颜色
        painter.setPen(text_color)
        #绘制文本
        painter.drawText(option, Qt.AlignLeft, item_text)#option.rect 是一个 QRect 对象,它定义了要绘制的项的矩形区域。这个矩形通常对应于项在视图中的位置和大小。Qt.AlignCenter 是一个枚举值,用于指定文本的对齐方式。在这种情况下,它表示文本应该在 option.rect 指定的矩形中居中对齐。
        # # 设置边框
        # border_color, border_width = QtGui.QColor(61,61,61), 1# 设置边框颜色和宽度
        # pen = QtGui.QPen(border_color, border_width)
        # painter.setPen(pen)
        # # #绘制边框
        # painter.drawRect(option)

        # 恢复painter的原始配置
        painter.restore()

listview item 绘制按钮

class PaintItem(QStyledItemDelegate):
    def paint(self, painter, option, index):
        #绘制默认文本
        super(CustomDelegate, self).paint(painter, option, index)
        # 绘制按钮的区域
        button_rect = QRect(option.rect.right() - 50, option.rect.top(), 50, option.rect.height())
        painter.setBrush(QBrush(QColor(200, 200, 200)))
        painter.drawRect(button_rect)
        painter.drawText(button_rect, int(Qt.AlignCenter), "Button")
#设置项代理为自定义的IndexDelegate
delegate = PaintItem()
self.listview.setItemDelegate(delegate)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仓库叉车高科技安全辅助设备——AI防碰撞系统N2024G-2

在当今这个高效运作、安全第一的物流时代,仓库作为供应链的中心地带,其安全与效率直接关系到企业的命脉。 随着科技的飞速发展,传统叉车作业模式正逐步向智能化、安全化转型,而在这场技术革新中,AI防碰撞系统N2024G-2…

python-redis访问指南

Redis(Remote Dictionary Server)是一种开源的内存数据结构存储,可用作数据库、缓存和消息代理。它功能强大且灵活,可根据需求调整架构和配置,以高性能、简单易用、支持多种数据结构而闻名,广泛应用于各种场…

Flash Attention V3使用

Flash Attention V3 概述 Flash Attention 是一种针对 Transformer 模型中注意力机制的优化实现,旨在提高计算效率和内存利用率。随着大模型的普及,Flash Attention V3 在 H100 GPU 上实现了显著的性能提升,相比于前一版本,V3 通…

UE5失真材质

渐变材质函数:RadialGradientExponential(指数径向渐变) 函数使用 UV 通道 0 来产生径向渐变,同时允许用户调整半径和中心点偏移。 用于控制渐变所在的位置及其涵盖 0-1 空间的程度。 基于 0-1 的渐变中心位置偏移。 源自中心的径…

Ansys Aqwa 中 Diffraction Analysis 的疲劳结果

了解如何执行疲劳分析,包括由 Ansys Aqwa 计算的海浪行为。 了解疲劳分析 大多数机器故障是由于负载随时间变化,而不是静态负载。这种失效通常发生在应力水平明显低于材料的屈服强度时。因此,当存在动态载荷时,仅依赖静态失效理…

MT8788安卓核心板_MTK8788核心板参数_联发科模块定制开发

MT8788安卓核心板是一款尺寸为52.5mm x 38.5mm x 2.95mm的高集成度电路板,专为各种智能设备应用而设计。该板卡整合了处理器、图形处理单元(GPU)、LPDDR3内存、eMMC存储及电源管理模块,具备出色的性能与低功耗特性。 这款核心板搭载了联发科的MT8788处理…

【UE5 C++课程系列笔记】19——通过GConfig读写.ini文件

步骤 1. 新建一个Actor类,这里命名为“INIActor” 2. 新建一个配置文件“Test.ini” 添加一个自定义配置项 3. 接下来我们在“INIActor”类中获取并修改“CustomInt”的值。这里定义一个方法“GetINIVariable” 方法实现如下,其中第16行代码用于构建配…

Qt天气预报系统设计界面布局第四部分右边

Qt天气预报系统 1、第四部分右边的第一部分1.1添加控件 2、第四部分右边的第二部分2.1添加控件 3、第四部分右边的第三部分3.1添加控件3.2修改控件名字 1、第四部分右边的第一部分 1.1添加控件 拖入一个widget,改名为widget04r作为第四部分的右边 往widget04r再拖…

机器学习基础-机器学习的常用学习方法

半监督学习的概念 少量有标签样本和大量有标签样本进行学习;这种方法旨在利用未标注数据中的结构信息来提高模型性能,尤其是在标注数据获取成本高昂或困难的情况下。 规则学习的概念 基本概念 机器学习里的规则 若......则...... 解释:如果…

搭建nginx文件服务器

1、创建一个nginx配置文件/etc/nginx/nginx.conf user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream;server {li…

MySql---进阶篇(六)---SQL优化

6.1:insert的优化: (1)普通的插入数据 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 1). 优…

逐光的黑色羽翼:一位黑色超模的成长之路-中小企实战运营和营销工作室博客

逐光的黑色羽翼:一位黑色超模的成长之路-中小企实战运营和营销工作室博客 在遥远的非洲肯尼亚,有一个小女孩名叫艾拉。她生活在一个小小的部落村庄里,每天伴随着朝阳起床,跟着家人放牧,在广袤无垠的草原上奔跑嬉戏&am…

Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在快节奏的生活中,家庭聚餐成为了连接亲情…

Github拉取项目报错解决

前言 昨天在拉取github上面的项目报错了,有好几个月没用github了,命令如下: git clone gitgithub.com:zhszstudy/git-test.git报错信息: ssh: connect to host github.com port 22: Connection timed out fatal: Could not rea…

学AI编程的Prompt工程,豆包Marscode

学习链接:Datawhale-AI活动https://www.datawhale.cn/activity/116/23/95?rankingPage1 目录 一、如何使用 二、编写游戏 2.1 创意输入与代码生成 2.2 项目初始化与应用 2.3 创意优化与迭代 三、效果展示 一、如何使用 建议在在vscode上安装marscode插件&a…

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降(GD) 全批量:在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

计算机网络 (19)扩展的以太网

前言 以太网(Ethernet)是一种局域网(LAN)技术,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网技术不断演进,从最初的10Mbps到如今的10Gbps、25Gbps、40Gbps、100Gbps等,已成…

JavaVue-Get请求 数组参数(qs格式化前端数据)

前言 现在管理系统,像若依,表格查询一般会用Get请求,把页面的查询条件传递给后台。其中大部分页面会有日期时间范围查询这时候,为了解决请求参数中的数组文件,前台就会在请求前拦截参数中的日期数组数据,然…

.e01, ..., .e0n的分卷压缩包怎么解压

用BandiZip,这些分卷压缩中还有一个.exe的文件,这个不是可执行文件,是一个解压缩的开头。 安装好bandiZip后,右键这个.exe文件 点击打开就是开始解压了: 最后解压后是这些。然后一个个再次解压.

库伦值自动化功耗测试工具

1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流,并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理:基于文件节点 coulomb_count 实现,计算公式:电流&…