解决PyQt5中QStackedWidget内次级QListWidget的文本获取问题
问题解决:获取QStackedWidget内次级QListWidget的文本
问题根源
你在stack_ui方法里把次级QListWidget赋值给了self.leftlist_in_leftlist这个实例属性,但每次循环创建新的次级列表时,这个属性会被覆盖,最终它只会指向最后一个创建的QListWidget。当你切换到其他栈页面时,当前显示的QListWidget和self.leftlist_in_leftlist指向的不是同一个对象,所以调用currentRow()自然返回-1。
解决方法
- 用字典存储所有次级QListWidget,避免单个属性被覆盖
- 通过信号发送者或栈当前索引,定位到当前显示的次级列表,再获取选中内容
修改后的完整代码
import sys from PyQt5.QtWidgets import * from numpy.random import randint # data d = {i: [j for j in randint(100, size=10)] for i in randint(100, size=10)} d_key = list(d.keys()) class MainTest(QMainWindow): def __init__(self): super().__init__() mhbox = QHBoxLayout() # 主列表 self.leftlist = QListWidget() self.Stack = QStackedWidget() self.stack = {} # 新增字典存储所有次级QListWidget,索引与栈页面对应 self.sub_list_widgets = {} for i in range(len(d_key)): self.leftlist.insertItem(i, f"{d_key[i]}") self.stack[i] = QWidget() self.Stack.addWidget(self.stack[i]) self.stack_ui(i) mhbox.addWidget(self.leftlist) mhbox.addWidget(self.Stack) self.leftlist.currentRowChanged.connect(self.Stack.setCurrentIndex) widget = QWidget() widget.setLayout(mhbox) self.setCentralWidget(widget) self.show() def stack_ui(self, i): list_in_key = d[d_key[i]] sub_list = QListWidget() for n in range(len(list_in_key)): sub_list.insertItem(n, f"{list_in_key[n]}") sub_list.currentRowChanged.connect(self.get_name) # 将次级列表存入字典 self.sub_list_widgets[i] = sub_list hbox_in_leftlist = QHBoxLayout() hbox_in_leftlist.addWidget(sub_list) self.stack[i].setLayout(hbox_in_leftlist) def get_name(self): # 方式1:通过sender()直接获取触发信号的次级列表 sender_list = self.sender() if sender_list.currentItem(): print(f"选中行号:{sender_list.currentRow()}") print(f"选中文本:{sender_list.currentItem().text()}") # 方式2:通过栈当前索引获取对应次级列表(可选) current_stack_idx = self.Stack.currentIndex() current_sub_list = self.sub_list_widgets[current_stack_idx] if current_sub_list.currentItem(): print(f"栈索引匹配-选中行号:{current_sub_list.currentRow()}") print(f"栈索引匹配-选中文本:{current_sub_list.currentItem().text()}") if __name__ == '__main__': app = QApplication(sys.argv) m = MainTest() sys.exit(app.exec_())
代码说明
self.sub_list_widgets字典保存了每个栈页面对应的次级QListWidget,彻底解决属性被覆盖的问题- 提供两种获取方式:
sender()方法:直接定位触发信号的列表对象,无需依赖栈索引,更灵活- 栈索引方法:通过当前显示的栈页面索引匹配对应列表,适合需要主动获取的场景
- 增加
if currentItem()判断,避免未选中任何项时调用text()触发报错
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

