2013-02-13 223 views
0

当使用自动连接连接插槽,而QListView :: currentChanged(电流,以前的)信号,我得到:解决的:Qt 4.8.4:不能插槽连接而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 (解决方案):

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

感谢您的帮助!

+0

我不知道PySide _at all_,但你没有装饰'onmodelosView_currentChanged(..)'方法作为一个插槽,而不是信号? – cmannett85 2013-02-13 15:41:18

+0

它应该是一个插槽。你为什么认为这应该是一个信号? – 2013-02-14 11:15:25

+0

“没有匹配的信号on_modelosView_currentChanged(QModelIndex,QModelIndex)” – cmannett85 2013-02-14 11:48:46

回答

0

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

0

这不是来自您的connect()声明,而是来自setupUi()

默认情况下,setupUi()增加QMetaObject::connectSignalsByName(widget)通话,其中widget是传递给setupUi()参数(在你的情况:self)。

调用,反过来,会寻找的self所有插槽使用一个名称类似

on_ChildObjectName_SignalName 

,并会尝试找出如果self有一个名为ChildObjectName(在意义上的子对象。QObject::objectName();如果是这样,它会尝试连接其SignalName到插槽显然你不喜欢这样的东西

长话短说:d除非您打算使用connectSignalsByName,否则请不要使用on_Child_Signal模式命名您的插槽。 (另一方面,使用Designer创建的小部件非常方便:由于Designer始终为子小部件提供一个名称,因此您可以使用此功能轻松连接到它们的信号,只需创建一个名为on_Child_Signal的插槽即可神奇的工作。)

+0

问题是,在上面的代码中,modelosView是使用Designer创建的,如果您注意到第一个引号中的错误消息,您将看到名为on_modelosView_currentChanged(QModelIndex,QModelIndex)的插槽。 所以我想使用自动连接,但它似乎并没有在这种情况下工作,我不知道为什么。我在几乎所有其他插槽中使用自动连接。 我在这里做的是试图不使用自动连接,看它是否工作,但它不是! – 2013-02-14 11:21:38

+0

'(另一方面,使用Designer创建的小部件非常方便:由于Designer始终为子小部件提供名称,因此您可以使用此功能轻松地连接到它们的信号,只需创建一个名为on_Child_Signal的插槽并且它会奇迹般地工作)“我做到了。并得到'QMetaObject :: connectSlotsByName:没有匹配的信号on_modelosView_currentChanged(QModelIndex,QModelIndex)'错误。 – 2013-02-14 14:28:36

+0

奇怪。您的视图在.ui中完全称为“modelosView” – peppe 2013-02-14 16:48:19