2013-02-13 7 views
0

QListView :: currentChanged() При подключении слот для сигнала QListView :: currentChanged (текущий, предыдущий) с помощью автоматического подключения я получаю:Решено: Qt 4.8.4: Невозможно подключиться слот для сигнала

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.

Моя цель - использовать этот сигнал для обновления индекса mapper, чтобы пользователь мог выбрать элемент, который он хочет в QListView, и отредактировать его в QPlainTextEdit с помощью сопоставления.

Edit: Для того, чтобы очистить путаницы это код, который породил первую ошибку:

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) 

Edit 2 (Решение):

Хорошо, я проверял документы в десятый раз и понял, что QListView :: currentChanged (...) на самом деле является слотом , а не сигнал. Я просто создал собственный подкласс QListView с нужным сигналом и сделал currentChanged вместо этого.

Спасибо за помощь!

+0

Я не знаю PySide _at all_, но разве вы не украсили метод onmodelosView_currentChanged (..) 'как слот, а не сигнал? – cmannett85

+0

Предполагается, что это слот. Почему вы думаете, что это должен быть сигнал? –

+0

«Нет соответствующего сигнала для on_modelosView_currentChanged (QModelIndex, QModelIndex)» – cmannett85

ответ

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 не назовите свои слоты, используя шаблон on_Child_Signal, если вы не планируете использовать connectSignalsByName.

(С другой стороны, это очень удобно для виджетов создан с помощью конструктора: так как конструктор всегда дает ребенок виджеты имени, вы можете легко подключить к их сигналам с помощью этой функции, просто создать слот под названием on_Child_Signal, и он будет волшебная работа.)

+0

Дело в том, что в коде выше modelosView был создан с использованием конструктора, и если вы заметили сообщение об ошибке в первой цитате, вы увидите слот с именем on_modelosView_currentChanged (QModelIndex, QModelIndex). Так что я хочу использовать автосоединение, но он, похоже, не работает над этим делом, и я понятия не имею, почему. Я использую автосоединение почти во всех других слотах. Что я здесь делал, пытался не использовать автосоединение, чтобы посмотреть, работает ли оно, но это не так! –

+0

'(С другой стороны, это довольно удобно для виджетов, созданных с помощью Designer: поскольку Designer всегда дает дочерним виджетам имя, вы можете легко подключиться к своим сигналам, используя эту функцию, просто создайте слот под названием on_Child_Signal, и он будет волшебным образом работать .) 'Я сделал. и получил 'QMetaObject :: connectSlotsByName: Отсутствует соответствующий сигнал для ошибки on_modelosView_currentChanged (QModelIndex, QModelIndex). –

+0

Странно. Ваш вид называется точно «modelosView» в .ui? – peppe

 Смежные вопросы

  • Нет связанных вопросов^_^