PyQt4 按钮连接问题
PyQt4 PushButton connection issue
有 class GUI_XMLtool 是从 .ui QtDesigner 文件生成的。
还有一个MyApp class。现在我正在尝试将 PushButton (XSD_path_PB) 单击连接到 MyApp 方法调用。我正在尝试两种方式(其中一种被评论)
from PyQt4 import QtCore, QtGui
from GUI import GUI_XMLtool
import sys
class MyApp(QtGui.QMainWindow, GUI_XMLtool):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = GUI_XMLtool()
self.ui.setupUi(self)
self.connect(self.ui.XSD_path_PB, QtCore.SIGNAL("clicked()"), self.someMethod())
#self.ui.XSD_path_PB.clicked.connect(self.someMethod())
def someMethod(self):
print "wahwah"
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
这是最简单的事情,但我得到了一个可怕的错误跟踪:
wahwah
Traceback (most recent call last):
File "C:/Users/***/PycharmProjects/XMLTool/GUI/Main.py", line 20, in <module>
window = MyApp()
File "C:/Users/***/PycharmProjects/XMLTool/GUI/Main.py", line 12, in __init__
self.connect(self.ui.XSD_path_PB, QtCore.SIGNAL("clicked()"), self.someMethod())
TypeError: arguments did not match any overloaded call:
QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
怎么了?
使用新样式的信号和槽(评论的那个),你应该写:
self.ui.XSD_path_PB.clicked.connect(self.someMethod)
而不是
self.ui.XSD_path_PB.clicked.connect(self.someMethod())
当第二行被执行时,self.someMethod()
被调用,并且return是一个值(在你的例子中是默认的return值None
)。然后,使用此值调用 connect
。它期望这个值是一个 python 可调用的(一个方法),但它不是(它是 None
),所以你得到一个 TypeError
。
要获得 python 可调用,您只需使用 self.someMethod
>>>type(someMethod)
<class 'function'>
有 class GUI_XMLtool 是从 .ui QtDesigner 文件生成的。 还有一个MyApp class。现在我正在尝试将 PushButton (XSD_path_PB) 单击连接到 MyApp 方法调用。我正在尝试两种方式(其中一种被评论)
from PyQt4 import QtCore, QtGui
from GUI import GUI_XMLtool
import sys
class MyApp(QtGui.QMainWindow, GUI_XMLtool):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = GUI_XMLtool()
self.ui.setupUi(self)
self.connect(self.ui.XSD_path_PB, QtCore.SIGNAL("clicked()"), self.someMethod())
#self.ui.XSD_path_PB.clicked.connect(self.someMethod())
def someMethod(self):
print "wahwah"
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
这是最简单的事情,但我得到了一个可怕的错误跟踪:
wahwah
Traceback (most recent call last):
File "C:/Users/***/PycharmProjects/XMLTool/GUI/Main.py", line 20, in <module>
window = MyApp()
File "C:/Users/***/PycharmProjects/XMLTool/GUI/Main.py", line 12, in __init__
self.connect(self.ui.XSD_path_PB, QtCore.SIGNAL("clicked()"), self.someMethod())
TypeError: arguments did not match any overloaded call:
QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
怎么了?
使用新样式的信号和槽(评论的那个),你应该写:
self.ui.XSD_path_PB.clicked.connect(self.someMethod)
而不是
self.ui.XSD_path_PB.clicked.connect(self.someMethod())
当第二行被执行时,self.someMethod()
被调用,并且return是一个值(在你的例子中是默认的return值None
)。然后,使用此值调用 connect
。它期望这个值是一个 python 可调用的(一个方法),但它不是(它是 None
),所以你得到一个 TypeError
。
要获得 python 可调用,您只需使用 self.someMethod
>>>type(someMethod)
<class 'function'>