You need to enable JavaScript to run this app. PyQt5如何将QListWidget选中项更新到当前焦点对应的QLineEdit控件
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5如何将QListWidget选中项更新到当前焦点对应的QLineEdit控件

问题解决方法

问题根源

每次切换输入框焦点时,你都重新给QListWidget的clicked信号绑定了新的槽函数,但旧的信号连接没有被主动移除。点击列表项时,所有历史绑定的槽函数都会依次执行,最终会将内容写入最早绑定的输入框,所以看起来只有第一个文本框会被更新。

修复方案

方案1:最小改动(保留原有代码结构)

只需要在绑定新信号前,先断开QListWidget之前的clicked信号连接即可,修改主文件的on_focusChanged方法:

def on_focusChanged(self):
    fwidget = QtWidgets.QApplication.focusWidget()
    if fwidget is not None:
        focus_widget_name = fwidget.objectName()
        # 新增:断开之前所有绑定的clicked信号连接
        try:
            self.lb1.clicked.disconnect()
        except TypeError:
            # 没有已绑定的信号时跳过异常
            pass

        if focus_widget_name == "tb1":
            self.lb1.clear()
            self.lb1.addItems(data_1)
            self.getdetails_1 = My_File(self.tb1, self.lb1)

        if focus_widget_name == "tb2":
            self.lb1.clear()
            self.lb1.addItems(data_2)
            self.getdetails_1 = My_File(self.tb2, self.lb1)

        if focus_widget_name == "tb3":
            self.lb1.clear()
            self.lb1.addItems(data_3)
            self.getdetails_1 = My_File(self.tb3, self.lb1)

方案2:更简洁的优化写法

不用反复创建My_File实例,将逻辑整合到主类中,性能更高:

import sys

from PyQt5 import QtWidgets

data_1 = ["America","India","Russia","Brazil","Swden","China"]
data_2 = ["Apple","Mango","Grapes","Pine","Berry","Banana"]
data_3 = ["item001","item002","item003","item,004","item005","item006"]

class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Example")
        self.tb1 = QtWidgets.QLineEdit()
        self.tb1.setObjectName("tb1")
        self.tb2 = QtWidgets.QLineEdit()
        self.tb2.setObjectName("tb2")
        self.tb3 = QtWidgets.QLineEdit()
        self.tb3.setObjectName("tb3")
        self.lb1 = QtWidgets.QListWidget()
        # 存储当前要写入的目标文本框
        self.current_target = None

        self.vbox = QtWidgets.QVBoxLayout()
        self.hbox = QtWidgets.QHBoxLayout()
        self.vbox.addWidget(self.tb1)
        self.vbox.addWidget(self.tb2)
        self.vbox.addWidget(self.tb3)
        self.hbox.addLayout(self.vbox)
        self.hbox.addWidget(self.lb1)
        self.setLayout(self.hbox)

        # 只绑定一次列表点击事件
        self.lb1.clicked.connect(self.fill_textbox)
        QtWidgets.QApplication.instance().focusChanged.connect(self.on_focusChanged)

    def fill_textbox(self):
        selected_item = self.lb1.currentItem()
        if self.current_target and selected_item:
            self.current_target.setText(selected_item.text())
            self.current_target.setFocus()

    def on_focusChanged(self):
        fwidget = QtWidgets.QApplication.focusWidget()
        if fwidget in [self.tb1, self.tb2, self.tb3]:
            self.current_target = fwidget
            self.lb1.clear()
            if fwidget.objectName() == "tb1":
                self.lb1.addItems(data_1)
            elif fwidget.objectName() == "tb2":
                self.lb1.addItems(data_2)
            elif fwidget.objectName() == "tb3":
                self.lb1.addItems(data_3)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    win = Example()
    win.show()
    sys.exit(app.exec_())

两种方案都可以实现需求:哪个输入框获得焦点,点击列表项就会把选中内容写入对应输入框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:24:10