Pyqt将插槽连接到具有默认参数且不带lambda的函数

问题描述 投票:0回答:2

我在Pyqt中有一个非常相似的问题,它解决了herehere,其中通过lambda调用具有不同参数的一个函数。

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyForm(QMainWindow):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)
        button1 = QPushButton('Button 1')
        button2 = QPushButton('Button 2')
        button1.clicked.connect(lambda: self.on_button(1))
        button2.clicked.connect(lambda: self.on_button(2))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)

        main_frame = QWidget()
        main_frame.setLayout(layout)

        self.setCentralWidget(main_frame)

    def on_button(self, n):
        print('Button {0} clicked'.format(n))

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    form = MyForm()
    form.show()
    app.exec_()

我的两个问题是:

我如何使用默认参数来使其工作?有没有使用lambda函数的解决方案? (我想要这样做的唯一原因是因为使用lambda函数会感到错误和过于复杂,并且我认为可能会有更简单的解决方案。)

我的(无效的)想法看起来像:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyForm(QMainWindow):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)
        button1 = QPushButton('Button 1')
        button2 = QPushButton('Button 2')
        button1.clicked.connect(self.on_button()) # this should call on_button with n set to default
        #button1.clicked.connect(lambda: self.on_button()) #this works, but uses a lambda
        button2.clicked.connect(lambda: self.on_button(2))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)

        main_frame = QWidget()
        main_frame.setLayout(layout)

        self.setCentralWidget(main_frame)

    def on_button(self, n=1): #using default argument
        print('Button {0} clicked'.format(n))

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    form = MyForm()
    form.show()
    app.exec_()
python pyqt signals-slots
2个回答
0
投票

如果您不想使用lambda,则语法应为button1.clicked.connect(self.on_button)

但是QPushButton::clicked具有布尔checked参数(see the doc)。因此,n参数将永远不会采用默认值。


0
投票

我通常在单个插槽处理来自不同来源的多个等效信号的情况下使用functools.partial

from functools import partial

# in __init__
button1.clicked.connect(self.on_button)
button1.clicked.connect(partial(self.on_button, n=2))

# and using a slot with kwarg n=1 as in your code

[在引擎盖下,这只是创建了一个中间包装函数,这增加了kwarg,因此,这与lambda非常相似,更多的是品味问题,而不是真正的优势。

© www.soinside.com 2019 - 2024. All rights reserved.