在 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
该类的代码是由pysideuic
Qt Designer 的 .ui 文件生成的,但我将其缩短了一点以更好地突出问题。