【发布时间】:2019-03-20 08:00:09
【问题描述】:
我试图在两个 PyQt5 类之间传递一个参数。我用了三种方法:
- 使用 lambda 函数。
- 包装函数(类似于 lambda 函数)。
-
partial来自functools模块。
在下面的示例中,我有两个窗口:
- MainWindow 具有 QLineEdit
mw_line_edit和 QPushButtonmw_open_new_dialog_button。 - 对话框:有一个 QLineEdit
line_edit和一个QPushButtonpush_button。
当我点击按钮push_button时,我希望它把line_edit的内容插入mw_line_edit。
这是一个最小的例子:
import sys
from functools import partial
from PyQt5 import QtWidgets, QtGui, QtCore
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.central_widget = QtWidgets.QWidget(self)
self.setCentralWidget(self.central_widget)
self.mw_open_new_dialog_button = QtWidgets.QPushButton('Open New dialog', self)
self.mw_line_edit = QtWidgets.QLineEdit(self)
self.hlayout = QtWidgets.QHBoxLayout(self)
self.hlayout.addWidget(self.mw_open_new_dialog_button)
self.hlayout.addWidget(self.mw_line_edit)
self.central_widget.setLayout(self.hlayout)
self.mw_open_new_dialog_button.clicked.connect(self.open_new_dialog)
def open_new_dialog(self):
self.dlg = Dialog()
#self.dlg.clicked.connect(partial(self.write_something, self.dlg.line_edit.text())) # <<<<<<< This does not work
self.dlg.clicked.connect(lambda: self.write_something(self.dlg.line_edit.text())) # this works
#self.dlg.clicked.connect(self.wrapper(self.dlg.line_edit.text()))# <<<<<<<<<<This does not work
self.dlg.exec()
@QtCore.pyqtSlot()
def write_something(self, text):
self.mw_line_edit.setText(text)
def wrapper(self, text):
return lambda: self.write_something(text)
class Dialog(QtWidgets.QDialog):
clicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(QtWidgets.QDialog, self).__init__(parent)
self.hlayout = QtWidgets.QHBoxLayout(self)
self.line_edit = QtWidgets.QLineEdit(self)
self.push_button = QtWidgets.QPushButton('Click me', self)
self.hlayout.addWidget(self.line_edit)
self.hlayout.addWidget(self.push_button)
self.label = QtWidgets.QLabel('I am a Qlabel', self)
self.hlayout.addWidget(self.label)
self.setLayout(self.hlayout)
self.push_button.clicked.connect(self.clicked)
def write_something(self, text):
print(text)
app = QtWidgets.QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec())
正如您在注释行中看到的,只有以下方法有效:
self.dlg.clicked.connect(lambda: self.write_something(self.dlg.line_edit.text()))
为什么其他两个不起作用,即:
self.dlg.clicked.connect(partial(self.write_something, self.dlg.line_edit.text())) # <<<<<<< This does not work
self.dlg.clicked.connect(self.wrapper(self.dlg.line_edit.text()))# <<<<<<<<<<This does not work
谢谢
【问题讨论】:
-
你的问题是什么?
-
@eyllanesc:我问了一个问题:为什么 partial 和 wrapper 不起作用
-
@eyllanesc:如果我试图将额外的参数传递给同一个类中的插槽,
partial和wrapper都可以工作,但在我的情况下,有两个类为什么它们不起作用?
标签: python python-3.x pyqt5