效果图
自定义一个item
新建一个qwidget对象
在qwidget内添加layout
在layout内添加要的控件
为qwidget设置layout
新建一个qlistwidgetitem并调整大小
为qlistwidgetitem设置qwidget
创建布局
首先我们创建一个最基本的布局, 只有一个listwidget和一个pushbutton
实现点击button后在listwidget中添加数据
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_())
确定布局
可以看出此布局总体是一个横向布局(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
显示效果:
全部代码
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":"u80e1u5fb7","ship_country":"eu56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/1.png","ship_type":"u6218u5de1"},{"ship_name":"u6d4bu8bd5","ship_country":"eu56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/2.png","ship_type":"u6218u5de1"},{"ship_name":"u6d4bu8bd52","ship_country":"eu56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/3.png","ship_type":"u6218u5de1"},{"ship_name":"u6d4bu8bd53","ship_country":"eu56fd","ship_star":"5","ship_index":"1","ship_photo":"icon/4.png","ship_type":"u6218u5de1"}]') 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_())
以上为个人经验,希望能给大家一个参考,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。如有错误或未考虑完全的地方,望不吝赐教。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/595964.html