QListWidget是PyQt中用于显示列表项的控件,它可以包含自定义的列表项小工具。自定义列表项通常通过QListWidgetItem和自定义的widget组合实现,允许开发者创建复杂的列表项布局。
# 假设已经有一个自定义列表项
for i in range(list_widget.count()):
item = list_widget.item(i)
widget = list_widget.itemWidget(item)
# 更新widget中的组件
if hasattr(widget, 'label'):
widget.label.setText("新文本")
def update_list_item(row, new_data):
# 获取当前项
item = list_widget.takeItem(row)
# 创建新的自定义widget
new_widget = QWidget()
layout = QHBoxLayout()
label = QLabel(new_data)
layout.addWidget(label)
new_widget.setLayout(layout)
# 重新设置项
list_widget.insertItem(row, item)
list_widget.setItemWidget(item, new_widget)
虽然QListWidget是便捷类,但也可以部分使用模型/视图的概念:
# 批量更新所有项
list_widget.clear()
for data in new_data_list:
item = QListWidgetItem()
widget = CustomListItemWidget(data) # 自定义的widget类
list_widget.addItem(item)
list_widget.setItemWidget(item, widget)
class CustomListItemWidget(QWidget):
def __init__(self, text, parent=None):
super().__init__(parent)
self.layout = QHBoxLayout(self)
self.label = QLabel(text)
self.button = QPushButton("更新")
self.button.clicked.connect(self.update_text)
self.layout.addWidget(self.label)
self.layout.addWidget(self.button)
def update_text(self):
self.label.setText("已更新: " + str(time.time()))
原因: PyQt有时不会自动重绘
解决: 调用list_widget.update()
或list_widget.viewport().update()
原因: 可能忘记设置布局或widget大小 解决: 确保自定义widget有正确的布局和大小策略
item.setSizeHint(widget.sizeHint()) # 设置合适的大小
原因: 大量项更新时可能卡顿 解决:
setUpdatesEnabled(False)
暂停更新,完成后再启用from PyQt5.QtWidgets import (QApplication, QListWidget, QListWidgetItem,
QWidget, QVBoxLayout, QLabel, QPushButton)
from PyQt5.QtCore import Qt
import sys
import time
class CustomListItem(QWidget):
def __init__(self, text, parent=None):
super().__init__(parent)
layout = QVBoxLayout(self)
self.label = QLabel(text)
self.update_btn = QPushButton("更新时间")
self.update_btn.clicked.connect(self.update_time)
layout.addWidget(self.label)
layout.addWidget(self.update_btn)
def update_time(self):
self.label.setText(f"当前时间: {time.strftime('%H:%M:%S')}")
class DemoWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
layout = QVBoxLayout(self)
self.list_widget = QListWidget()
self.add_items()
update_btn = QPushButton("批量更新")
update_btn.clicked.connect(self.batch_update)
layout.addWidget(self.list_widget)
layout.addWidget(update_btn)
self.setWindowTitle("QListWidget自定义项更新")
self.resize(300, 400)
def add_items(self):
for i in range(5):
item = QListWidgetItem()
item.setSizeHint(QSize(200, 80)) # 设置合适的大小
self.list_widget.addItem(item)
widget = CustomListItem(f"项目 {i+1}")
self.list_widget.setItemWidget(item, widget)
def batch_update(self):
# 暂停界面更新提高性能
self.list_widget.setUpdatesEnabled(False)
for i in range(self.list_widget.count()):
item = self.list_widget.item(i)
widget = self.list_widget.itemWidget(item)
if isinstance(widget, CustomListItem):
widget.label.setText(f"批量更新项目 {i+1}")
# 恢复界面更新
self.list_widget.setUpdatesEnabled(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = DemoWindow()
demo.show()
sys.exit(app.exec_())
这个示例展示了如何创建自定义列表项、单独更新和批量更新列表项内容。
没有搜到相关的文章