PyQt5 在QListWidget自定义Item的操作

效果图

自定义一个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":"\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_())

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

(0)

相关推荐

  • python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法

    QWidget基本介绍 基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口或者控件都直接或者间接的继承自QWidget类. 窗口坐标系统 PyQt使用统一的坐标系统来定位窗口控件的位置和大小,具体如下 以屏幕左上角为原点,也就是(0, 0)点,从左向右为x轴正方向,从上向下为y轴正方向,整个屏幕的坐标系统用来定位顶层窗口. 在窗口内部也有自己的坐标系统,该坐标系统以客户区的左上角为原点,从左向右为x轴正方向,从上到下为y轴正方向,在客户区周围有标题栏和边框. 从上图中,可以将这些成

  • pyqt5 QlistView列表显示的实现示例

    1.简介 QlistView类用于展示数据,它的子类是QListWIdget.QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据 QListWidget是一个升级版本的QListView,它已经建立了一个数据储存模型(QListWidgetItem),直接调用addItem()函数,就可以添加条目(Item) QListView类中常用的方法如表 方法 描述 setModel() 用来设置View所关联的Model,可以使用Python原生的list作为数据源Mod

  • PyQt5高级界面控件之QTableWidget的具体使用方法

    前言 QTableWidget是Qt程序中常用的显示数据表格的控件,类似于c#中的DataGrid.QTableWidget是QTableView的子类,它使用标准的数据模型,并且其单元数据是通过QTableWidgetItem对象来实现的,使用QTableWidget时就需要QTableWidgetItem.用来表示表格中的一个单元格,整个表格就是用各个单元格构建起来的 QTableWidget类中的常用方法 方法 描述 setROwCount(int row) 设置QTableWidget表

  • PyQt5 在QListWidget自定义Item的操作

    效果图 自定义一个Item 新建一个QWidget对象 在QWidget内添加Layout 在Layout内添加要的控件 为QWidget设置Layout 新建一个QListWidgetItem并调整大小 为QListWidgetItem设置QWidget 创建布局 首先我们创建一个最基本的布局, 只有一个listWidget和一个pushButton 实现点击button后在listWidget中添加数据 class Windows(QMainWindow, Ui_MainWindow): d

  • 详解QListWidget如何实现自定义Item效果

    首先,我们来看以下实现的最终效果吧! 我觉得这并不是一个很难得问题,最近新招了一个应届生,发现在实现上述效果时,被困扰住了,是不是刚刚接触Qt的这种稍微有难度的界面时,都会有些无头绪呢? 所以,我打算分享给大家实现的思路,以及会出现的问题,就我一个开发5年C++的员工而言,针对新手会遇到哪些不懂的问题. 当前的开发环境:win10 VS2017 + Qt5.14.2 x64 在实现过程中新手会出现的难点,如下 1:如何在QListWidget中添加带有按钮.文本等其它控件的一条数据? 2:选中每

  • pyqt qlistwidget改变item颜色的操作

    我就废话不多说了,大家还是直接看代码吧~ 实例: from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * import sys class Win(QWidget): def __init__(self): super(Win, self).__init__() self.setObjectName("

  • VUE-ElementUI 自定义Loading图操作

    需求: element ui loading图只能使用自己的loading图, 但很多场景下,需要替换成自己的gif图 虽然文档中有些, element-loading-spinner="el-icon-loading" 可指定自定义图 但经测试,也只是只能再elementui 图标库中的图, 不是我们想的那个自定义图类的意思. 自定义图方法: 1) 添加自定义elementUI loading样式 asserts下 新建CSS文件夹 及CSS文件比如myCss.css 再里面,写入自

  • Python PyQt5学习之自定义信号

    PyQ5已经自动定义了很多QT自建的信号.但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号.通过使用pyqtSignal()方法定义新的信号,新的信号作为类的属性. 自定义signal说明: 新的信号应该定义在QObject的子类中.新的信号必须作为定义类的一部分,不允许将信号作为类的属性在类定义之后通过动态的方式进行添加.通过这种方式新的信号才能自动的添加到QMetaObject类中.这就意味这新定义的信号将会出现在Qt Designer,并且可以通过QMetaObject

  • C++自定义封装socket操作业务类完整实例

    本文实例讲述了C++自定义封装socket操作业务类.分享给大家供大家参考,具体如下: Linux下C++封装socket操作的工具类(自己实现) socketconnector.h #ifndef SOCKETCONNECTOR_H #define SOCKETCONNECTOR_H #include "global.h" using namespace std; class SocketConnector { public: typedef enum { ENormal, EOth

  • C#自定义的字符串操作增强类实例

    本文实例讲述了C#自定义的字符串操作增强类.分享给大家供大家参考.具体如下: 这个C#类在C#自由的字符串操作类的基础上进行的大幅度增强,把我们平时可能用到的字符串操作都做进去了,字符串的处理我想大部分编程都不可避免,有了这个类,可以节省你很多时间,同时可以根据自己的需要对这个C#字符串类进行扩展. using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpress

  • Yii2框架自定义验证规则操作示例

    本文实例讲述了Yii2框架自定义验证规则操作.分享给大家供大家参考,具体如下: 废话不多说直接上代码 class AbcModel extends Model { public $aaa; public $bbb; public $bbb; /** * 验证提交的form表单 * * @return array */ public function rules() { return [ // 自定义验证 [['aaa', 'bbb', 'ccc'], 'customValidationCityC

  • Java8并行流中自定义线程池操作示例

    本文实例讲述了Java8并行流中自定义线程池操作.分享给大家供大家参考,具体如下: 1.概览 java8引入了流的概念,流是作为一种对数据执行大量操作的有效方式.并行流可以被包含于支持并发的环境中.这些流可以提高执行性能-以牺牲多线程的开销为代价 在这篇短文中,我们将看一下 Stream API的最大限制,同时看一下如何让并行流和线程池实例(ThreadPool instance)一起工作. 2.并行流Parallel Stream 我们先以一个简单的例子来开始-在任一个Collection类型

  • thinkphp5框架实现的自定义扩展类操作示例

    本文实例讲述了thinkphp5框架实现的自定义扩展类操作.分享给大家供大家参考,具体如下: 1.在extend目录下新建要定义的扩展类:如下图所示 2.定义扩展类的内容 <?php namespace org; /** * */ class Auth { public function __construct() { # code... } public function xx() { echo 'xxxxxxxxxxxxxx'; } } 3.在控制器中调用自定义的扩展类 <?php nam

随机推荐