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

解决PyQt5中QStackedWidget内次级QListWidget的文本获取问题

问题解决:获取QStackedWidget内次级QListWidget的文本

问题根源

你在stack_ui方法里把次级QListWidget赋值给了self.leftlist_in_leftlist这个实例属性,但每次循环创建新的次级列表时,这个属性会被覆盖,最终它只会指向最后一个创建的QListWidget。当你切换到其他栈页面时,当前显示的QListWidget和self.leftlist_in_leftlist指向的不是同一个对象,所以调用currentRow()自然返回-1。

解决方法

  1. 用字典存储所有次级QListWidget,避免单个属性被覆盖
  2. 通过信号发送者或栈当前索引,定位到当前显示的次级列表,再获取选中内容

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:30:47