单击事件在我启动应用程序后立即发送(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())
我有一个带有按钮的应用程序,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())