2013-02-13 224 views
0

當使用自動連接連接插槽,而QListView :: currentChanged(電流,以前的)信號,我得到:解決的:Qt 4.8.4:不能插槽連接而QListView :: currentChanged()信號

QMetaObject::connectSlotsByName: No matching signal for on_modelosView_currentChanged(QModelIndex,QModelIndex) 

不使用自動連接,我得到:

AttributeError: 'builtin_function_or_method' object has no attribute 'connect' 

我使用PySide和我的代碼如下:

class Modelos(QtGui.QDialog): 
def __init__(self, parent): 
    QtGui.QDialog.__init__(self, parent) 
    self.ui = Ui_Dialog() 
    self.ui.setupUi(self) 

    # Inicializa o modelo 
    self.model = ModelosModel(self) 
    self.ui.modelosView.setModel(self.model) 
    # Inicializa o mapper 
    self.mapper = QtGui.QDataWidgetMapper(self) 
    self.mapper.setModel(self.model) 
    self.mapper.addMapping(self.ui.modelosEdit, 0) 
    self.mapper.toFirst() 
    self.ui.modelosView.currentChanged.connect(self.onmodelosView_currentChanged) 

@QtCore.Slot(QtCore.QModelIndex, QtCore.QModelIndex) 
def onmodelosView_currentChanged(self, current, previous): 
    self.mapper.setCurrentIndex(current.row()) 

其中: ModelosModel是QtAbstractListModel的子類,modelosView是QListView小部件。

我的目標是使用此信號來更新映射器索引,以便用戶可以在QListView中選擇他想要的項目並使用映射器在QPlainTextEdit中進行編輯。

編輯:要清除的混亂,這是發起第一錯誤代碼:

class Modelos(QtGui.QDialog): 
def __init__(self, parent): 
    QtGui.QDialog.__init__(self, parent) 
    self.ui = Ui_Dialog() 
    self.ui.setupUi(self) 

    # Inicializa o modelo 
    self.model = ModelosModel(self) 
    self.ui.modelosView.setModel(self.model) 
    # Inicializa o mapper 
    self.mapper = QtGui.QDataWidgetMapper(self) 
    self.mapper.setModel(self.model) 
    self.mapper.addMapping(self.ui.modelosEdit, 0) 
    self.mapper.toFirst() 

@QtCore.Slot(QtCore.QModelIndex, QtCore.QModelIndex) 
def on_modelosView_currentChanged(self, current, previous): 
    self.mapper.setCurrentIndex(current.row()) 

我清楚地使用自動連接功能,但我得到了錯誤:

QMetaObject::connectSlotsByName: No matching signal for on_modelosView_currentChanged(QModelIndex,QModelIndex) 

編輯2 (解決方案):

好吧,我正在檢查文檔的第十次,只是意識到QListView :: currentChanged(...)實際上是一個插槽而不是一個信號。我只是用我需要的信號創建了QListView的自定義子類,並使currentChanged發出該信號。

感謝您的幫助!

+0

我不知道PySide _at all_,但你沒有裝飾'onmodelosView_currentChanged(..)'方法作爲一個插槽,而不是信號? – cmannett85 2013-02-13 15:41:18

+0

它應該是一個插槽。你爲什麼認爲這應該是一個信號? – 2013-02-14 11:15:25

+0

「沒有匹配的信號on_modelosView_currentChanged(QModelIndex,QModelIndex)」 – cmannett85 2013-02-14 11:48:46

回答

0

好的,我正在檢查文檔的第十次,只是意識到QListView :: currentChanged(...)實際上是一個插槽,而不是一個信號。我只是用我需要的信號創建了QListView的自定義子類,並使currentChanged發出該信號。

0

這不是來自您的connect()聲明,而是來自setupUi()

默認情況下,setupUi()增加QMetaObject::connectSignalsByName(widget)通話,其中widget是傳遞給setupUi()參數(在你的情況:self)。

調用,反過來,會尋找的self所有插槽使用一個名稱類似

on_ChildObjectName_SignalName 

,並會嘗試找出如果self有一個名爲ChildObjectName(在意義上的子對象。QObject::objectName();如果是這樣,它會嘗試連接其SignalName到插槽顯然你不喜歡這樣的東西

長話短說:d除非您打算使用connectSignalsByName,否則請不要使用on_Child_Signal模式命名您的插槽。 (另一方面,使用Designer創建的小部件非常方便:由於Designer始終爲子小部件提供一個名稱,因此您可以使用此功能輕鬆連接到它們的信號,只需創建一個名爲on_Child_Signal的插槽即可神奇的工作。)

+0

問題是,在上面的代碼中,modelosView是使用Designer創建的,如果您注意到第一個引號中的錯誤消息,您將看到名爲on_modelosView_currentChanged(QModelIndex,QModelIndex)的插槽。 所以我想使用自動連接,但它似乎並沒有在這種情況下工作,我不知道爲什麼。我在幾乎所有其他插槽中使用自動連接。 我在這裏做的是試圖不使用自動連接,看它是否工作,但它不是! – 2013-02-14 11:21:38

+0

'(另一方面,使用Designer創建的小部件非常方便:由於Designer始終爲子小部件提供名稱,因此您可以使用此功能輕鬆地連接到它們的信號,只需創建一個名爲on_Child_Signal的插槽並且它會奇蹟般地工作)「我做到了。並得到'QMetaObject :: connectSlotsByName:沒有匹配的信號on_modelosView_currentChanged(QModelIndex,QModelIndex)'錯誤。 – 2013-02-14 14:28:36

+0

奇怪。您的視圖在.ui中完全稱爲「modelosView」 – peppe 2013-02-14 16:48:19