Qt 4.8.4:无法将插槽连接到QListView :: currentChanged()信号

时间:2013-02-13 14:41:08

标签: python qt signals pyside qlistview

使用自动连接将插槽连接到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 个答案:

答案 0 :(得分:0)

它不是来自connect()声明,而是来自setupUi()

默认情况下,setupUi()会添加对QMetaObject::connectSignalsByName(widget)的调用,其中widget是传递给setupUi()的参数(在您的情况下为self)。< / p>

反过来,该调用会查找名称类似的self的所有广告位

on_ChildObjectName_SignalName

并尝试找出如果self有一个名为ChildObjectName 的子对象(在QObject::objectName()意义上;如果有,它会尝试将其SignalName 连接到该广告位。显然你不会那样。

长话短说:不要使用on_Child_Signal模式命名您的广告位,除非您打算使用connectSignalsByName

(另一方面,使用Designer创建的小部件非常方便:因为Designer总是为子小部件命名,您可以通过使用此功能轻松连接其信号,只需创建一个名为on_Child_Signal的小部件它会神奇地工作。)

答案 1 :(得分:0)

好的,我第十次检查文档,只是意识到QListView :: currentChanged(...)实际上是一个插槽,而不是一个信号。我刚刚用我需要的信号创建了一个QListView的自定义子类,并使currentChanged发出了该信号。