[英]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()
ChildObjectName
( QObject::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.