news 2026/4/27 21:16:27

PyQt5:自定义QListView显示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PyQt5:自定义QListView显示
  • item显示索引号
  • 添加图标
  • 绘制图形
  • 设置文本样式

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

创建列表视图

#创建listviewimportsysfromPyQt5importQtCore,QtWidgetsclassUi_Dialog(object):def__init__(self):self.FormData=FormData()#listview控件数据处理defsetupUi(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更灵活,适用于更复杂的需求

classFormData:@staticmethoddefaddStringModel(data:list,obj):#用于简单的字符串列表显示model=QtCore.QStringListModel()# 创建数据模型model.setStringList(data)# 模型添加数据obj.setModel(model)#将模型设置到 QListView#listview item绑定额外数据@staticmethoddefaddStandModel(data:str,info,obj):#添加视图中的文本数据和存储在后台的数据(不显示)model=QStandardItemModel()# 创建一个 QStandardItemModelobj.setModel(model)# 将模型关联到 QListViewitem=QStandardItem()# 添加额外信息ifisinstance(info,list):#多中额外信息fori,valueinenumerate(info):item.setData(value,role=Qt.UserRole+i+1)else:item.setData(info,role=Qt.UserRole+1)#infor:可以为字典,字符串等数据存储在后台#Qt.DisplayRole: 这是默认角色,用于显示文本或图标。Qt.DecorationRole: 用于设置图标。Qt.UserRole: 开始用于应用程序特定数据的自定义角色。#添加默认文本内容ifbool(data):item.setText(data,role=Qt.DisplayRole)# 添加数据到模型obj.model().appendRow(QStandardItem(item))#listview末尾添加
#listview添加多个itemself.FormData.addStringModel(['a','b','c'],self.listview)#listview item 绑定额外数据self.FormData.QStandardItemModel('a',['A','ascill值'],self.listview)
  • item显示索引号
  • 添加图标
  • 绘制图形
  • 设置文本样式

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

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

classPaintItem(QStyledItemDelegate):#defpaint(self,painter,option,index):# 获取itme默认文本数据# text = index.data(Qt.DisplayRole)#******************绘制额外文本********************************index_number=index.row()+1# 获取当前项的索引号,intinfo=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添加代理,自定义显示内容

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

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

#自定义代理类:自定义委托,重写paint()方法来绘制指定item的样式(背景、文字颜色、边框、图标)classPaintItem(QStyledItemDelegate):def__init__(self,spriteData=None,pixmap=None,addIcon=False):super().__init__()self.spriteData=spriteData#精灵图self.pixmap=pixmap#self.addIcon=addIcon#item是否添加图标#绘制、显示item样式defpaint(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)# 设置图片大小为21x21icon=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 绘制按钮

classPaintItem(QStyledItemDelegate):defpaint(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")
#设置项代理为自定义的IndexDelegatedelegate=PaintItem()self.listview.setItemDelegate(delegate)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 21:16:25

深度学习基础:神经网络CNN/RNN完全指南

深度学习基础:神经网络CNN/RNN完全指南 【免费下载链接】interview 📚 C/C 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the basi…

作者头像 李华
网站建设 2026/4/27 21:15:26

AWS API网关架构设计模式:构建高可用的微服务架构终极指南

AWS API网关架构设计模式:构建高可用的微服务架构终极指南 【免费下载链接】og-aws 📙 Amazon Web Services — a practical guide 项目地址: https://gitcode.com/gh_mirrors/og/og-aws GitHub 加速计划(og/aws)提供了关于…

作者头像 李华
网站建设 2026/4/27 21:12:47

1000+ JavaScript面试题:从基础到进阶的终极准备指南

1000 JavaScript面试题:从基础到进阶的终极准备指南 【免费下载链接】javascript-interview-questions List of 1000 JavaScript Interview Questions 项目地址: https://gitcode.com/GitHub_Trending/ja/javascript-interview-questions JavaScript作为Web开…

作者头像 李华
网站建设 2026/4/27 21:12:11

Sciter行为系统详解:自定义UI组件和交互逻辑的实现

Sciter行为系统详解:自定义UI组件和交互逻辑的实现 【免费下载链接】sciter-sdk Sciter is an embeddable HTML/CSS/scripting engine 项目地址: https://gitcode.com/gh_mirrors/sc/sciter-sdk Sciter是一个强大的嵌入式HTML/CSS/脚本引擎,其行为…

作者头像 李华
网站建设 2026/4/27 21:11:00

git-aware-prompt未来展望:AI集成和智能Git状态预测

git-aware-prompt未来展望:AI集成和智能Git状态预测 【免费下载链接】git-aware-prompt Display current Git branch name in your terminal prompt when in a Git working directory. 项目地址: https://gitcode.com/gh_mirrors/gi/git-aware-prompt git-aw…

作者头像 李华