单击事件在我启动应用程序后立即发送(PySide 和 Python)

Click event is sent immediately after I start application (PySide and Python)

我有一个带有按钮的应用程序,clicked 信号连接到打开 QFileDialog 的插槽。我想根据用户在 QFileDialog 中采取的操作来操纵插槽内按钮(发送方)的状态。

但是,使用我目前的代码,我的应用程序无法正确启动。它立即以 QFileDialogOpen 开始,我不明白为什么。当我评论将按钮的点击信号连接到插槽的行时,应用程序正常启动。

当我想将按钮的 clicked 信号连接到插槽时,如何正确地将按钮作为参数传递?这是我的问题的 MCWE:

from PySide import QtGui
import sys

class MyApplication(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyApplication, self).__init__(parent)

        self.fileButton = QtGui.QPushButton('Select File')
        self.fileButton.clicked.connect(self.select_file(self.fileButton))

        layout = QtGui.QGridLayout()
        layout.addWidget(self.fileButton)
        self.setLayout(layout)

    def select_file(self, button):
        file_name = QtGui.QFileDialog.getOpenFileName()
        if str(file_name[0]) is not "":
            button.setEnabled(True)
        else:
            button.setDisabled(True)


if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    w = MyApplication()    
    w.show()

    sys.exit(app.exec_()) 

您没有使用 PySide signals/slots 绑定实际函数 call,而是绑定了 function方法,或类似函数的对象,使用PySide的signals/slots.

你有:

self.fileButton.clicked.connect(self.select_file(self.fileButton))

这告诉 Qt 将点击事件绑定到从 self.select_file 函数调用返回的东西,它可能没有 __call__ 属性并且是立即调用(导致打开 QFileDialog)

你想要的是:

from functools import partial
self.fileButton.clicked.connect(partial(self.select_file, self.fileButton))

这将创建一个可调用的、冻结的类函数对象,带有供 Qt 调用的参数。

这相当于说:

self.fileButton.clicked.connect(self.select_file)

而不是说:

self.fileButton.clicked.connect(self.select_file())