You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:45:41