欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PyQt5 在QListWidget自定义Item的操作

程序员文章站 2022-07-08 11:53:11
效果图自定义一个item新建一个qwidget对象在qwidget内添加layout在layout内添加要的控件为qwidget设置layout新建一个qlistwidgetitem并调整大小为qli...

效果图

PyQt5 在QListWidget自定义Item的操作

自定义一个item

新建一个qwidget对象

在qwidget内添加layout

在layout内添加要的控件

为qwidget设置layout

新建一个qlistwidgetitem并调整大小

为qlistwidgetitem设置qwidget

创建布局

首先我们创建一个最基本的布局, 只有一个listwidget和一个pushbutton

实现点击button后在listwidget中添加数据

PyQt5 在QListWidget自定义Item的操作

class windows(qmainwindow, ui_mainwindow):
 def __init__(self):
  super(windows, self).__init__()
  self.setupui(self)
  self.pushbutton.clicked.connect(self.deal)
 def deal(self):
  # 准备实现的功能
  pass
app = qtwidgets.qapplication(sys.argv)
windows = windows()
windows.show()
sys.exit(app.exec_())

确定布局

PyQt5 在QListWidget自定义Item的操作

可以看出此布局总体是一个横向布局(qhboxlayout), 再其右边是一个纵向(qvboxlayout), 下面的布局又是一个横向布局(qhboxlayout)

def get_item():
 # 总widget
 wight = qwidget()
 # 布局
 layout_main = qhboxlayout() # 总体横向布局
 layout_right = qvboxlayout() # 右边的纵向布局
 layout_right_down = qhboxlayout() # 右下的横向布局
 layout_right.addlayout(layout_right_down) # 右下布局填充到右边布局中
 layout_main.addlayout(layout_right) # 右边布局填充入总布局
 wight.setlayout(layout_main) # 为widget设置总布局

添加数据

{
 "ship_name": "胡德",
 "ship_country": "e国",
 "ship_star": "5",
 "ship_index": "1",
 "ship_photo": "1.png",
 "ship_type": "战巡"
}
def get_item_wight(data):
 # 读取属性
 ship_name = data['ship_name']
 ship_photo = data['ship_photo']
 ship_index = data['ship_index']
 ship_type = data['ship_type']
 ship_country = data['ship_country']
 ship_star = data['ship_star']
 # 总widget
 wight = qwidget()
 # 总体横向布局
 layout_main = qhboxlayout()
 map_l = qlabel() # 头像显示
 map_l.setfixedsize(40, 25)
 maps = qpixmap(ship_photo).scaled(40, 25)
 map_l.setpixmap(maps)
 # 右边的纵向布局
 layout_right = qvboxlayout()
 # 右下的的横向布局
 layout_right_down = qhboxlayout() # 右下的横向布局
 layout_right_down.addwidget(qlabel(ship_type))
 layout_right_down.addwidget(qlabel(ship_country))
 layout_right_down.addwidget(qlabel(str(ship_star) + "星"))
 layout_right_down.addwidget(qlabel(ship_index))
 # 按照从左到右, 从上到下布局添加
 layout_main.addwidget(map_l) # 最左边的头像
 layout_right.addwidget(qlabel(ship_name)) # 右边的纵向布局
 layout_right.addlayout(layout_right_down) # 右下角横向布局
 layout_main.addlayout(layout_right) # 右边的布局
 wight.setlayout(layout_main) # 布局给wight
 return wight # 返回wight

设置qlistwidgetitem

for ship_data in your_data:
 item = qlistwidgetitem() # 创建qlistwidgetitem对象
 item.setsizehint(qsize(200, 50)) # 设置qlistwidgetitem大小
 widget = get_item_wight(ship_data) # 调用上面的函数获取对应
 self.listwidget.additem(item) # 添加item
 self.listwidget.setitemwidget(item, widget) # 为item设置widget

显示效果:

PyQt5 在QListWidget自定义Item的操作

全部代码

import sys
import json
from pyqt5.qtwidgets import *
from pyqt5.qtgui import *
from pyqt5.qtcore import *
from pyqt5 import qtcore, qtgui, qtwidgets
class ui_mainwindow(object):
 """
 自动生成的代码, 请不要修改
 """
 def setupui(self, mainwindow):
  mainwindow.setobjectname("mainwindow")
  mainwindow.resize(455, 357)
  self.centralwidget = qtwidgets.qwidget(mainwindow)
  self.centralwidget.setobjectname("centralwidget")
  self.listwidget = qtwidgets.qlistwidget(self.centralwidget)
  self.listwidget.setgeometry(qtcore.qrect(10, 10, 341, 341))
  self.listwidget.setobjectname("listwidget")
  self.pushbutton = qtwidgets.qpushbutton(self.centralwidget)
  self.pushbutton.setgeometry(qtcore.qrect(360, 10, 81, 31))
  self.pushbutton.setobjectname("pushbutton")
  mainwindow.setcentralwidget(self.centralwidget)
  self.retranslateui(mainwindow)
  qtcore.qmetaobject.connectslotsbyname(mainwindow)
 def retranslateui(self, mainwindow):
  _translate = qtcore.qcoreapplication.translate
  mainwindow.setwindowtitle(_translate("mainwindow", "mainwindow"))
  self.pushbutton.settext(_translate("mainwindow", "pushbutton"))
class windows(qmainwindow, ui_mainwindow):
 def __init__(self):
  super(windows, self).__init__()
  self.setupui(self)
  self.pushbutton.clicked.connect(self.deal)
 def deal(self):
  all_data = json.loads('[{"ship_name":"\u80e1\u5fb7","ship_country":"e\u56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/1.png","ship_type":"\u6218\u5de1"},{"ship_name":"\u6d4b\u8bd5","ship_country":"e\u56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/2.png","ship_type":"\u6218\u5de1"},{"ship_name":"\u6d4b\u8bd52","ship_country":"e\u56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/3.png","ship_type":"\u6218\u5de1"},{"ship_name":"\u6d4b\u8bd53","ship_country":"e\u56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/4.png","ship_type":"\u6218\u5de1"}]')
  def get_item_wight(data):
   # 读取属性
   ship_name = data['ship_name']
   ship_photo = data['ship_photo']
   ship_index = data['ship_index']
   ship_type = data['ship_type']
   ship_country = data['ship_country']
   ship_star = data['ship_star']
   # 总widget
   wight = qwidget()
   # 总体横向布局
   layout_main = qhboxlayout()
   map_l = qlabel() # 头像显示
   map_l.setfixedsize(40, 25)
   maps = qpixmap(ship_photo).scaled(40, 25)
   map_l.setpixmap(maps)
   # 右边的纵向布局
   layout_right = qvboxlayout()
   # 右下的的横向布局
   layout_right_down = qhboxlayout() # 右下的横向布局
   layout_right_down.addwidget(qlabel(ship_type))
   layout_right_down.addwidget(qlabel(ship_country))
   layout_right_down.addwidget(qlabel(str(ship_star) + "星"))
   layout_right_down.addwidget(qlabel(ship_index))
   # 按照从左到右, 从上到下布局添加
   layout_main.addwidget(map_l) # 最左边的头像
   layout_right.addwidget(qlabel(ship_name)) # 右边的纵向布局
   layout_right.addlayout(layout_right_down) # 右下角横向布局
   layout_main.addlayout(layout_right) # 右边的布局
   wight.setlayout(layout_main) # 布局给wight
   return wight # 返回wight
  for ship_data in all_data:
   item = qlistwidgetitem() # 创建qlistwidgetitem对象
   item.setsizehint(qsize(200, 50)) # 设置qlistwidgetitem大小
   widget = get_item_wight(ship_data) # 调用上面的函数获取对应
   self.listwidget.additem(item) # 添加item
   self.listwidget.setitemwidget(item, widget) # 为item设置widget
app = qtwidgets.qapplication(sys.argv)
windows = windows()
windows.show()
sys.exit(app.exec_())

补充:pyqt5 qlistwiget点击item事件

我就废话不多说了,大家还是直接看代码吧~

from pyqt4.qtcore import qcoreapplication, qt
from pyqt4.qtgui import qlistwidget, qlistwidgetitem, qapplication 
import sys 
class mylist(qlistwidget):
 def __init__(self):
  qlistwidget.__init__(self)
  self.add_items()
  self.itemclicked.connect(self.item_click)
 
 def add_items(self):
  for item_text in ['item1', 'item2', 'item3']:
   item = qlistwidgetitem(item_text)
   self.additem(item)
 
 def item_click(self, item):
  print item, str(item.text())
 
if __name__ == '__main__':
 app = qapplication([])
 mylist = mylist()
 mylist.show()
 sys.exit(app.exec_())

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。