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

0 投票
2 回答
1486 浏览
提问于 2025-04-17 15:45

当我用自动连接的方式把一个槽函数连接到 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)

2 个回答

0

问题不是出在你的 connect() 语句上,而是出在 setupUi() 上。

默认情况下,setupUi() 会调用 QMetaObject::connectSignalsByName(widget),这里的 widget 是传给 setupUi() 的参数(在你的例子中就是 self)。

这个调用会去找 self 中所有名字类似于

on_ChildObjectName_SignalName

的槽函数,并试图判断 是否 self 有一个名为 ChildObjectName 的子对象(这里指的是 QObject::objectName() 的意思;如果有的话,它会尝试把 SignalName 的信号连接到那个槽函数上。显然,你并没有这样的东西。

简单来说:除非你打算使用 connectSignalsByName,否则不要用 on_Child_Signal 这种方式命名你的槽函数

(另一方面,对于使用 Designer 创建的控件来说,这种方式非常方便:因为 Designer 总是给子控件命名,你可以通过这个功能轻松连接它们的信号,只需创建一个名为 on_Child_Signal 的槽函数,它就会神奇地工作。)

0

好的,我刚刚查看文档第十遍,才意识到 QListView::currentChanged(...) 实际上是一个槽,而不是信号。我创建了一个 QListView 的自定义子类,里面加上了我需要的信号,并让 currentChanged 发出那个信号。

撰写回答