【问题标题】:Qt 4.8.4: Cannot connect slot to QListView::currentChanged() signalQt 4.8.4:无法将插槽连接到 QListView::currentChanged() 信号
【发布时间】:2013-02-13 14:41:07
【问题描述】:

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

【问题讨论】:

  • 我完全不知道 PySide,但是你没有把 onmodelosView_currentChanged(..) 方法装饰成一个槽,而不是一个信号吗?
  • 它应该是一个插槽。为什么你认为它应该是一个信号?
  • "on_modelosView_currentChanged(QModelIndex,QModelIndex) 没有匹配信号"
  • 它应该匹配 modelosView::currentChanged(...) 信号。 modelosView 是一个 QListView 小部件,应该有一个 currentChanged 信号来匹配我的插槽!

标签: python qt signals pyside qlistview


【解决方案1】:

它不是来自您的connect() 语句,而是来自setupUi()

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

该调用将依次查找self 的所有插槽,其名称类似于

on_ChildObjectName_SignalName

并且会尝试找出self 是否有一个名为ChildObjectName 的子对象(在QObject::objectName() 的意义上;如果是这样,它将尝试连接它的@ 987654333@ 到那个位置。显然你不会那样做。

长话短说:请勿使用 on_Child_Signal 模式命名您的插槽,除非您打算使用 connectSignalsByName

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

【讨论】:

  • 问题是,在上面的代码中,modelosView 是使用设计器创建的,如果您注意到第一个引用中的错误消息,您将看到名为 on_modelosView_currentChanged(QModelIndex,QModelIndex) 的插槽。所以我确实想使用自动连接,但它似乎不适用于这种情况,我不知道为什么。我几乎在所有其他插槽中都使用自动连接。我在这里所做的是尝试不使用自动连接来查看它是否正常工作,但事实并非如此!
  • (On the other hand, it's quite convenient for widgets created using Designer: since Designer always give child widgets a name, you can easily hook up to their signals by using this feature, just create a slot called on_Child_Signal and it will magically work.) 我做到了。并得到QMetaObject::connectSlotsByName: No matching signal for on_modelosView_currentChanged(QModelIndex,QModelIndex) 错误。
  • 奇怪。您的视图在 .ui 中是否完全称为“modelosView”?
  • 是的。检查我的第二次编辑以获取解决方案!感谢大家的帮助!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2015-03-14
    • 2016-11-10
    相关资源
    最近更新 更多