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

问题描述 投票:0回答:1

我在使用 PyQt4 的 connect() 时遇到问题。例如这里是通过 pyuic4 转换的 .UI。

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')
python pyqt
1个回答
10
投票

错误位于双注释行:

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

然后,您可以在调用

self.connect
时使用此方法作为参数 3:

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

请注意,由于方法名称后面没有

()
,因此我们不会调用该方法。我们将 方法本身 传递给
self.connect

© www.soinside.com 2019 - 2024. All rights reserved.