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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:39:01