PyQt - > connect() - > TypeError:参数不匹配任何重载的调用

问题描述:

我有与PyQt4连接()的问题。例如这里是.UI通过pyuic4转换。PyQt - > connect() - > TypeError:参数不匹配任何重载的调用

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_()) 

和.PY文件清单。请注意双注释行。有错误,但理论上应该起作用。

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_()) 

我得的是:

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' 

任何帮助,将不胜感激。


非常感谢Luke Woodward,这是一个正确的变体。

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') 

的错误是在双注释行:

##  self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), self.label.setText('ABC')) 

它看起来像你想要的标签组的文本ABC只要单击该按钮。但是,上面的代码行不会实现这一点。问题是第三个参数self.label.setText('ABC')在对self.connect进行调用时进行评估,而不是在信号触发时进行评估。

你写的什么东西有作为

value = self.label.setText('ABC') 
self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), value) 

setText方法相同的效果总是会返回None,因为没有什么回报。因为PyQt无法找到合适的connect方法调用参数3设置为None - 事实上,错误消息中的最后三行都提到了参数3和NoneType的问题 - “类型”的None

你可以做的反而是把你的代码的方法,例如:

def setLabelText(self): 
    self.label.setText('ABC') 

然后,您可以使用此方法作为参数3调用self.connect

self.connect(self.btnClearText, QtCore.SIGNAL('clicked()'), self.setLabelText) 

请注意,因为方法名称后面没有(),所以我们没有调用该方法。我们通过方法本身self.connect

+1

另外请注意与PyQt信号和插槽的新风格(http://www.riverbankcomputing.com/static/Docs/PyQt4/html/new_style_signals_slots.html)可以连接一个信号和插槽少代码。所以上面的代码制作信号和插槽连接可以写成:self.btnClearText.clicked.connect(self.setLabelText)。 – sateesh 2011-02-14 15:23:06