0

当使用自动连接将插槽连接到 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)
4

2 回答 2

0

它不是来自你的connect()陈述,而是来自setupUi()

默认情况下,setupUi()添加对 的调用,传递给的参数QMetaObject::connectSignalsByName(widget)在哪里(在您的情况下为:) 。widgetsetupUi()self

反过来,该调用将查找self名称类似于

on_ChildObjectName_SignalName

并会尝试找出是否self有一个名为的子对象ChildObjectName(在QObject::objectName(); 如果是这样的话,它会尝试将其连接SignalName到那个插槽。显然你没有这样的事情。

长话短说:除非on_Child_Signal打算使用connectSignalsByName.

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

于 2013-02-13T16:22:51.143 回答
0

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

于 2015-07-16T13:29:35.647 回答