2013-05-09 137 views
1

在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_listQListWidget)。

所以這裏是我的問題:爲什麼我收到此警告?我該怎麼做,所以它不會出現,因爲它似乎是不相關的?


編輯:由於我沒有在去年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類的代碼,但我縮短了一點,以更好的突出問題。

回答

4

我在C++中遇到同樣的問題。如果connectSlotsByName發現它不能自動連接的插槽,那麼connectSlotsByName將被硬編碼以輸出該消息,即使您不需要自動連接,因爲您已經自己明確地完成了它。你可以使用qInstallMsgHandler來抑制一般的警告,或者在更好的地方寫消息,但我不認爲有什麼辦法可以告訴connectSlotsByName你特別不關心這種情況。