PyQt5:如何为QListWidget的每个列表项添加删除按钮
可以实现该需求
要给QListWidget的每个列表项添加删除按钮并关联对应项,你可以通过QListWidget.setItemWidget()方法给每个列表项绑定自定义Widget,同时在自定义Widget中保存对应列表项的引用,具体实现如下:
修改后的完整代码
import sys from PyQt5.QtWidgets import ( QApplication, QHBoxLayout, QVBoxLayout, QGroupBox, QListWidget, QListWidgetItem, QWidget, QPushButton, QLabel, ) class ItemWidget(QWidget): def __init__(self, text, item, parent=None): super().__init__(parent) self.item = item # 保存当前列表项的引用 layout = QHBoxLayout(self) layout.setContentsMargins(8, 4, 8, 4) # 显示文本的标签 self.text_label = QLabel(text) layout.addWidget(self.text_label) # 添加拉伸空间,让删除按钮靠右对齐 layout.addStretch() # 删除按钮 self.delete_btn = QPushButton("删除") self.delete_btn.clicked.connect(self.handle_delete) layout.addWidget(self.delete_btn) def handle_delete(self): # 获取当前列表项所属的QListWidget list_widget = self.item.listWidget() if not list_widget: return # 获取项的索引并移除 row = list_widget.row(self.item) list_widget.takeItem(row) # 释放列表项内存 del self.item class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("List Item with button") self.centralwidgetHorizontalLayout = QHBoxLayout(self) self.Frame = QGroupBox() self.FrameHorizontalLayout = QHBoxLayout(self.Frame) self.ListWidget = QListWidget(self.Frame) self.ListWidget.setSpacing(11) self.ListWidget.setStyleSheet( "QListWidget { background: palette(window); border: none;}" "QListWidget::item {" "border-style: solid;" "border-width:1px;" "border-color: black;" "padding: 2px;" "}" "QListWidget::item:hover {" "border-color: green;" "}") self.FrameHorizontalLayout.addWidget(self.ListWidget) self.centralwidgetHorizontalLayout.addWidget(self.Frame) # 生成带删除按钮的列表项 for i in range(13): # 创建列表项 list_item = QListWidgetItem(self.ListWidget) # 创建自定义Widget item_widget = ItemWidget(f"Line {i+1}", list_item) # 设置列表项的尺寸以适配Widget list_item.setSizeHint(item_widget.sizeHint()) # 将Widget绑定到列表项 self.ListWidget.setItemWidget(list_item, item_widget) if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() window.showMaximized() sys.exit(app.exec_())
关键实现说明
- 自定义ItemWidget:每个列表项对应一个包含文本标签和删除按钮的Widget,通过布局让按钮靠右对齐,同时保存对应的
QListWidgetItem引用。 - 关联按钮与列表项:点击删除按钮时,通过保存的
self.item直接定位到对应的列表项,调用listWidget()获取所属的列表控件,再通过takeItem()移除项并释放内存。 - 样式适配:调整了原样式表中
QListWidget::item的margin-right为padding,避免遮挡删除按钮,同时设置列表项的尺寸以适配自定义Widget的大小。
内容的提问来源于stack exchange,提问作者Diana Mele
相关产品推荐
相关产品推荐

