PyQt PySide QListWidget 添加自定义 widget
原文链接: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)
运行结果: