如何使用 lambda 函数通过 Slot 的参数传递 QWidget 的文本

How to pass a QWidget's text through the parameter of Slot using lambda function

我想了解为什么我不能将参数传递给我的 Slot 函数。我定义了一个 showMessage(・・・) 函数,因此我可以将它与来自不同信号源的不同消息一起重用。但是下面的代码不起作用。我该如何修复代码,以便在显示 QMessageBox 时在按下的 QPushButton 正上方显示 QLineEdit 的文本。

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)

        button_1.clicked.connect(lambda state, \
                                 msg=self.mainWidget.layout().itemAt(0).widget().text(), \
                                 srcIndex=0: self.showMessage(msg, srcIndex))
        button_2.clicked.connect(lambda state, \
                                 msg=self.mainWidget.layout().itemAt(2).widget().text(), \
                                 srcIndex=2: self.showMessage(msg, 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_())

我确实检查了以下条目,但我认为它没有解决我的问题:

下一个:

button_1.clicked.connect(lambda state, \
                                 msg=self.mainWidget.layout().itemAt(0).widget().text(), \
                                 srcIndex=0: self.showMessage(msg, srcIndex))

等于:

msg=self.mainWidget.layout().itemAt(0).widget().text()
srcIndex=0
button_1.clicked.connect(lambda state, msg=msg, srcIndex=srcIndex: self.showMessage(msg, srcIndex))

实际上,您在构建 window 时传递的是文本,而不是按下按钮时的文本。

最好的办法是创建一个获取文本的中间函数:

    button_1.clicked.connect(lambda state, lineedit=lineEdit_1: self.foo(lineedit))
    button_2.clicked.connect(lambda state, lineedit=lineEdit_2: self.foo(lineedit))

def foo(self, lineedit):
    self.showMessage(lineedit.text())

def showMessage(self, message):
    msgBox = QMessageBox()
    msgBox.setWindowTitle("Message")
    msgBox.setIcon(QMessageBox.Information)
    msgBox.setText("\"" + str(message) + "\"")
    msgBox.setStandardButtons(QMessageBox.Yes)
    rtnVal = msgBox.exec()