PyQt --> connect() --> TypeError: arguments did not match any overloaded call
I have problems with connect() from PyQt4. For example here is .UI converted via pyuic4.
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(382, 258)
self.btnClearText = QtGui.QPushButton(Dialog)
self.btnClearText.setGeometry(QtCore.QRect(80, 220, 75, 23))
self.btnClearText.setObjectName(_fromUtf8("btnClearText"))
self.btnSetText = QtGui.QPushButton(Dialog)
self.btnSetText.setGeometry(QtCore.QRect(220, 220, 75, 23))
self.btnSetText.setObjectName(_fromUtf8("btnSetText"))
self.textEdit = QtGui.QTextEdit(Dialog)
self.textEdit.setGeometry(QtCore.QRect(10, 20, 361, 41))
self.textEdit.setObjectName(_fromUtf8("textEdit"))
self.textEdit_2 = QtGui.QTextEdit(Dialog)
self.textEdit_2.setGeometry(QtCore.QRect(10, 80, 361, 41))
self.textEdit_2.setObjectName(_fromUtf8("textEdit_2"))
self.label = QtGui.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(160, 170, 46, 13))
self.label.setObjectName(_fromUtf8("label"))
self.retranslateUi(Dialog)
QtCore.QObject.connect(self.btnSetText, QtCore.SIGNAL(_fromUtf8("released()")), self.textEdit_2.paste)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.btnClearText.setText(QtGui.QApplication.translate("Dialog", "Copy", None, QtGui.QApplication.UnicodeUTF8))
self.btnSetText.setText(QtGui.QApplication.translate("Dialog", "Paste", None, QtGui.QApplication.UnicodeUTF8))
self.textEdit.setHtml(QtGui.QApplication.translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:8pt;\">ABC</span></p></body><开发者_运维问答/html>", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
And .PY file listing. Please note double-commented line. There is error, but theoretically it should work.
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from simple import *
class MyApp(QtGui.QMainWindow, Ui_Dialog):
def __init__(self):
QtGui.QMainWindow.__init__(self)
Ui_Dialog.__init__(self)
self.setupUi(self)
## self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), self.label.setText('ABC'))
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
What I've got is:
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'
Any help would be appreciated.
Many thanks to Luke Woodward, here is a right variant.
class MyApp(QtGui.QMainWindow, Ui_Dialog):
def __init__(self):
QtGui.QMainWindow.__init__(self)
Ui_Dialog.__init__(self)
self.setupUi(self)
self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), self.setLabelText)
def setLabelText(self):
self.label.setText('ABC')
The error is on the double-commented line:
## self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), self.label.setText('ABC'))
It looks like you want the text of the label set to ABC
whenever the button is clicked. However, the above line of code will not achieve this. The problem is that the third argument, self.label.setText('ABC')
, is evaluated when the call to self.connect
is made, not when the signal fires.
What you've written has the same effect as
value = self.label.setText('ABC')
self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), value)
The setText
method will always return None
, since there's nothing to return. The error you get arises because PyQt can't find a suitable connect
method to call with the argument 3 set to None
- indeed, the last three lines in your error message all mention a problem with argument 3 and NoneType
- the 'type' of None
.
What you could do instead is to put your code in a method, for example:
def setLabelText(self):
self.label.setText('ABC')
Then, you use this method as argument 3 in the call to self.connect
:
self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), self.setLabelText)
Note that because there is no ()
after the method name, we're not calling the method. We're passing the method itself to self.connect
.
精彩评论