如何使用 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()
我想了解为什么我不能将参数传递给我的 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()