Qt 4.8.4:无法连接槽到QListView::currentChanged()信号
当我用自动连接的方式把一个槽函数连接到 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 个回答
问题不是出在你的 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
的槽函数,它就会神奇地工作。)
好的,我刚刚查看文档第十遍,才意识到 QListView::currentChanged(...) 实际上是一个槽,而不是信号。我创建了一个 QListView 的自定义子类,里面加上了我需要的信号,并让 currentChanged 发出那个信号。