在 Qt Designer 中,我创建了一个QDialog窗口并将pysideuic其编译为一个基类,该基类包含一个setupUi初始化所有 GUI 元素的方法,并且我扩展它以实现功能,如下所示:
class MyDialog(QtGui.QDialog, ui_file.Ui_main_dialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        ui_file.Ui_main_dialog.__init__(self)
        self.setupUi(self)
这个setupUi方法调用了QtCore.QObject.connect我在 Qt Designer 中创建的信号槽连接,我还在其中向 GUI 添加了新槽。这些插槽在生成的基类中不存在,pysideuic我将它们添加到MyDialog类中,例如
    def on_list_selection_changed(self):
        self.run_btn.setEnabled(len(self.modules_list.selectedIndexes()) > 0)
对于此示例,on_list_selection_changed()在 Qt Designer 中调用插槽(使用空参数列表)。
在初始化时,MyDialog.__init__调用Ui_main_dialog.setupUi最终调用QtCore.QMetaObject.connectSlotsByName(后两个与当前正在创建的MyDialog实例)。self这会在 上发出以下行sys.stderr:
QMetaObject::connectSlotsByName: No matching signal for on_list_selection_changed()
尽管如此,信号表现正确,并且在连接时调用插槽modules_list.itemSelectionChanged()(modules_list是 a QListWidget)。
所以这是我的问题:为什么我会收到这个警告?鉴于它似乎无关紧要,我该怎么做才能让它不出现?
编辑:由于我在过去 5 个月内没有收到任何答案,我想我举了一个完整的例子来更容易地重现问题。
这个例子与上面的问题不同,它只使用了一个QLineEdit实例。这是代码:
import sys
from PySide import QtCore, QtGui
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        self.lineEdit = QtGui.QLineEdit(Dialog)
        self.lineEdit.setObjectName("lineEdit")
        QtCore.QObject.connect(self.lineEdit, QtCore.SIGNAL("textChanged(QString)"), Dialog.on_lineEdit_changed)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
class MainWindow(QtGui.QMainWindow, Ui_Dialog):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        Ui_Dialog.__init__(self)
        Ui_Dialog.setupUi(self, self)
    @QtCore.Slot(unicode) # signal with no arguments
    def on_lineEdit_changed(self, text):
        print 'Changed to', text
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())
请注意,Ui_Dialog该类的代码是由pysideuicQt Designer 的 .ui 文件生成的,但我将其缩短了一点以更好地突出问题。