如何通过lambda函数将QWidget文本作为参数传递给Slot槽函数
问题根因
你的代码核心问题是Python中lambda默认参数的求值规则:函数的默认参数会在函数定义阶段(也就是执行connect绑定信号的那一刻)完成计算,不会在每次信号触发时重新求值。
你在绑定时LineEdit还没有任何用户输入,所以msg参数直接被固定为初始化时的空字符串,后续用户输入内容后点击按钮,传递给showMessage的msg还是初始的旧值,这也是为什么你代码里的debug打印能输出正确的最新文本,但弹窗显示内容不对——debug打印是每次调用showMessage时实时取的最新值,而msg是绑定时就固定的静态值。
修改方案
只需要调整信号绑定的lambda写法,把动态获取文本的逻辑放到lambda函数体内,保证每次点击按钮时都取最新的输入内容即可。固定不变的控件索引/实例可以保留为默认参数。
以下是可正常运行的完整修改代码:
import sys from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QMessageBox class Window(QtWidgets.QMainWindow): def __init__(self): super(Window, self).__init__() self.mainWidget = QWidget() mainLayout = QVBoxLayout(self.mainWidget) lineEdit_1 = QLineEdit() button_1 = QPushButton("Show Message 1") lineEdit_2 = QLineEdit() button_2 = QPushButton("Show Message 2") mainLayout.addWidget(lineEdit_1) mainLayout.addWidget(button_1) mainLayout.addWidget(lineEdit_2) mainLayout.addWidget(button_2) # 调整lambda写法:动态文本在函数体内实时获取,固定索引保留为默认参数 button_1.clicked.connect(lambda state, srcIndex=0: self.showMessage( self.mainWidget.layout().itemAt(srcIndex).widget().text(), srcIndex )) button_2.clicked.connect(lambda state, srcIndex=2: self.showMessage( self.mainWidget.layout().itemAt(srcIndex).widget().text(), srcIndex )) self.setCentralWidget(self.mainWidget) self.show() def showMessage(self, message, srcIndex): print("Debug Print (%d): %s" % (srcIndex, self.mainWidget.layout().itemAt(srcIndex).widget().text())) msgBox = QMessageBox() msgBox.setWindowTitle("Message") msgBox.setIcon(QMessageBox.Information) msgBox.setText("\"" + str(message) + "\"") msgBox.setStandardButtons(QMessageBox.Yes) rtnVal = msgBox.exec() if __name__ == "__main__": app = QApplication(sys.argv) GUI = Window() sys.exit(app.exec_())
优化建议
如果后续可能调整布局顺序,用索引定位控件容易出错,可以直接把LineEdit实例作为默认参数绑定,更易维护:
# 绑定示例 button_1.clicked.connect(lambda state, edit=lineEdit_1, srcIndex=0: self.showMessage(edit.text(), srcIndex)) button_2.clicked.connect(lambda state, edit=lineEdit_2, srcIndex=1: self.showMessage(edit.text(), srcIndex))
内容的提问来源于stack exchange,提问作者mak
相关产品推荐
相关产品推荐

