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

如何获取QListWidget中被点击按钮所在项的索引以删除该项

解决QListWidget中点击子按钮获取对应列表项索引的问题

问题根由

你之前靠parent()链找对应列表项的思路走不通,核心原因是QListWidgetItem不是QWidget子类——它只是存储数据的容器,你通过setItemWidget()设置的自定义widget,其父级是QListWidget的内部视图组件,根本不是对应的QListWidgetItem,所以顺着parent找永远拿不到目标项。

方案1:给按钮绑定索引/Item属性

创建按钮时,把当前项的索引或者Item本身作为自定义属性绑定到按钮上,点击时直接读取这个属性即可:

修改创建按钮的循环代码

# 循环内的代码
item = QtWidgets.QListWidgetItem()
item_widget = QtWidgets.QWidget()  
line_push_button = QtWidgets.QPushButton("-")
# 给按钮绑定当前项的索引i
line_push_button.setProperty("item_index", i)
line_push_button.clicked.connect(self.clicked)
line_text = QtWidgets.QLabel(testo)

item_layout = QtWidgets.QHBoxLayout()
item_layout.addWidget(line_push_button)
item_layout.addWidget(line_text)
    
item_widget.setLayout(item_layout)  
myList.insertItem(i, item)
myList.setItemWidget(item, item_widget)

修改clicked槽函数

def clicked(self):
    sender = self.sender()
    # 读取绑定的索引
    item_index = sender.property("item_index")
    if item_index is not None:
        myList.takeItem(item_index)

方案2:用Lambda直接传递索引到槽函数

创建按钮时,通过lambda把当前索引直接传给槽函数,逻辑更直观:

修改创建按钮的循环代码

# 循环内的代码
item = QtWidgets.QListWidgetItem()
item_widget = QtWidgets.QWidget()  
line_push_button = QtWidgets.QPushButton("-")
# 用lambda传递索引i,注意要写`idx=i`来捕获当前循环的i值,避免变量引用问题
line_push_button.clicked.connect(lambda checked, idx=i: self.clicked(idx))
line_text = QtWidgets.QLabel(testo)

item_layout = QtWidgets.QHBoxLayout()
item_layout.addWidget(line_push_button)
item_layout.addWidget(line_text)
    
item_widget.setLayout(item_layout)  
myList.insertItem(i, item)
myList.setItemWidget(item, item_widget)

修改clicked槽函数

def clicked(self, item_index):
    # 直接用传入的索引删除对应项
    myList.takeItem(item_index)

进阶:应对列表项顺序变动的情况

如果你的列表支持排序、拖拽调整顺序,索引会动态变化,这时候绑定Item本身更可靠:

创建按钮时绑定Item

line_push_button.setProperty("list_item", item)

槽函数中获取索引并删除

def clicked(self):
    sender = self.sender()
    target_item = sender.property("list_item")
    if target_item is not None:
        # 通过Item获取对应的行索引
        item_index = myList.indexFromItem(target_item).row()
        myList.takeItem(item_index)

内容的提问来源于stack exchange,提问作者Ferex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:41:19