簡體   English   中英

Qt 4.8.4:無法將插槽連接到QListView :: currentChanged()信號

[英]Qt 4.8.4: Cannot connect slot to QListView::currentChanged() signal

當使用自動連接將插槽連接到QListView :: currentChanged(current,previous)信號時,我得到:

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)

它不是來自connect()語句,而是來自setupUi()

默認情況下, setupUi()QMetaObject::connectSignalsByName(widget) setupUi()添加調用,其中widget是傳遞給setupUi()的參數(在您的情況下為self )。

反過來,該呼叫將尋找名稱類似的self所有位置

on_ChildObjectName_SignalName

並嘗試找出self是否有一個名為ChildObjectName的子對象 (按QObject::objectName() ChildObjectNameQObject::objectName() ;如果這樣, 它將嘗試將其SignalName連接到該插槽。顯然,您並不需要那樣做。

長話短說:除非計划使用connectSignalsByName否則不要使用on_Child_Signal模式命名插槽

(另一方面,對於使用Designer創建的窗口小部件來說,這非常方便:由於Designer始終為子窗口小部件提供名稱,因此您可以使用此功能輕松連接其窗口小部件的信號,只需創建一個名為on_Child_Signal的插槽, on_Child_Signal神奇地工作。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM