在Qt設計,我創建一個QDialog
窗口和用於pysideuic
來編譯到含有setupUi
方法初始化所有的GUI元件,並且我延伸來實現的功能的基類,像這樣:PySide:QMetaObject.connectSlotsByName發出警告「沒有匹配的信號...」但仍然有效..?
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設計。
在初始化,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
是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_())
注意,由pysideuic
從Qt設計師的的.ui文件生成的Ui_Dialog
類的代碼,但我縮短了一點,以更好的突出問題。