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
相关产品推荐
相关产品推荐

