原文链接:https://stackoverflow.com/questions/25187444/pyqt-qlistwidget-custom-items
参考链接:https://www.cnblogs.com/weizhixiang/p/5913775.html
前言:
QListWidget 的 addItem('item') 只是快速的往 list 里面添加文本 item,有时候我们会希望添加自定义的 widget,那么就会用到 addItem ( QListWidgetItem * item ),也就是说 addItem 参数只接受 QString 和 QListWidgetItem,如果要添加自定义的 widget,那么就要把 QListWidgetItem 和 QWidget关联起来,方式是使用 QListWidget 的 setItemWidget(QListWidgetItem, QWidget),不过还要注意一些其它的设置(item 的 size)。
我根据原文链接稍微修改的代码(把图片改为按钮):
该代码可以直接运行,注意自己使用的是 PyQt4 还是 PySide
1 # -*- coding: utf-8 -*-
2
3 import sys
4 from PySide import QtGui
5 #from PyQt4 import QtGui
6
7 class QCustomQWidget (QtGui.QWidget):
8 def __init__ (self, parent = None):
9 super(QCustomQWidget, self).__init__(parent)
10 self.textQVBoxLayout = QtGui.QVBoxLayout()
11 self.textUpQLabel = QtGui.QLabel()
12 self.textDownQLabel = QtGui.QLabel()
13 self.textQVBoxLayout.addWidget(self.textUpQLabel)
14 self.textQVBoxLayout.addWidget(self.textDownQLabel)
15 self.allQHBoxLayout = QtGui.QHBoxLayout()
16 self.iconQLabel = QtGui.QPushButton()
17 self.allQHBoxLayout.addWidget(self.iconQLabel, 0)
18 self.allQHBoxLayout.addLayout(self.textQVBoxLayout, 1)
19 self.setLayout(self.allQHBoxLayout)
20 # setStyleSheet
21 self.textUpQLabel.setStyleSheet('''
22 color: rgb(0, 0, 255);
23 ''')
24 self.textDownQLabel.setStyleSheet('''
25 color: rgb(255, 0, 0);
26 ''')
27
28 def setTextUp (self, text):
29 self.textUpQLabel.setText(text)
30
31 def setTextDown (self, text):
32 self.textDownQLabel.setText(text)
33
34 def setIcon (self, imagePath):
35 pass
36 #self.iconQLabel.setPixmap(QtGui.QPixmap(imagePath))
37
38 class exampleQMainWindow (QtGui.QMainWindow):
39 def __init__ (self):
40 super(exampleQMainWindow, self).__init__()
41 # Create QListWidget
42 self.myQListWidget = QtGui.QListWidget(self)
43 for index, name, icon in [
44 ('No.1', 'Meyoko', 'icon.png'),
45 ('No.2', 'Nyaruko', 'icon.png'),
46 ('No.3', 'Louise', 'icon.png')]:
47 # Create QCustomQWidget
48 myQCustomQWidget = QCustomQWidget()
49 myQCustomQWidget.setTextUp(index)
50 myQCustomQWidget.setTextDown(name)
51 myQCustomQWidget.setIcon(icon)
52 # Create QListWidgetItem
53 myQListWidgetItem = QtGui.QListWidgetItem(self.myQListWidget)
54 # Set size hint
55 myQListWidgetItem.setSizeHint(myQCustomQWidget.sizeHint())
56 # Add QListWidgetItem into QListWidget
57 self.myQListWidget.addItem(myQListWidgetItem)
58 self.myQListWidget.setItemWidget(myQListWidgetItem, myQCustomQWidget)
59 self.setCentralWidget(self.myQListWidget)
60
61 app = QtGui.QApplication([])
62 window = exampleQMainWindow()
63 window.show()
64 sys.exit(app.exec_())
从代码总结的思路和注意点是:
1. 创建 QListWidget
2. 创建 QListWidgetItem,父类为 QListWidget,可以理解为一个空的 item
3. 把 QListWidgetItem 添加到 QListWidget中:QListWidget.addItem(QListWidgetItem)
4. 创建 自定义的 QWidget
5. 把 QListWidgetItem 的 sizeHint 设置为 QWidget 的 sizeHint(如果不设置,看不到 QWidget)
6. 关联 QListWidgetItem 和 QWidget:QListWidget.setItemWidget(QListWidgetItem, QWidget)
运行结果: