2013-05-15 4 views
3

В Pyside documentation указано, что слоты могут иметь возвращаемые значения, но мне еще предстоит выяснить, как это сделать.PySide: Возврат значения из слота

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

def testSlot(self): 
    print('testSlot called') 
    return 'RETURN VALUE RETURN VALUE RETURN VALUE' 

И я пытаюсь захватить возвращаемое значение, как это:

ret = foo.testSignal.emit() 

Но это не работает. Мой тестовый код, который вы можете найти here, также crashes с this ошибка выхода. Помощь приветствуется!

Редактировать: Я удалил декоратор, который решает проблему сбой, но он все еще не возвращает значение, которое я хочу вернуть.

Запуск сценария, как это дает мне это:

foo.testSignal.emit()
testSlot называется
Истинную

+0

У вас есть два '@' s в декораторе – Blender

+0

Ой, не знаю, как это получилось. Я исправил его, но он по-прежнему падает. – sorbet

+0

Как он падает? Какова полная трассировка? – Blender

ответ

1

Я боюсь, что вы думаете, не представляется возможным. Сигналы и слоты слабо связаны друг с другом, поэтому излучение сигнала напрямую не вызывает слот, поэтому не может получить «свое» значение возврата.

Это может быть яснее, если вы об этом думаете:

Вы можете подключить 2 разных слотов (например из 2 различных классов), которые возвращают разные значения, в один сигнал. Какое из двух возвращаемых значений должно доходить до переменной, которую вы пытаетесь назначить?

Что вы, вероятно, имеете в виду, это this: Это нечто совершенно иное и позволяет возвращать значения посредством «вызова» метода над системой MetaObject «именем».

+0

Извините за отложенный ответ, я выхожу из страны, и доступ в Интернет ограничен. Можете ли вы рассказать о «вызове» метода над системой MetaObject под именем «name»? Как я могу взять с собой возвращаемое значение? – sorbet

+0

Вы можете «вызывать» или «вызывать» метод в Qt через систему MetaObject по его имени (как QString) в C++, используя [QMetaObject :: invokeMethod] (http://qt-project.org/doc/qt- 4.8/qmetaobject.html # invokeMethod) - так что это динамический, а не прекомпилированный. Он необходим для вызова метода C++, например. QML - QML может вызывать только методы, известные системой MetaObject. Поэтому Q_INVOCABLE необходим для того, чтобы сделать функцию известной - и если вы хотите получить возвращаемое значение, например. PySide в QML, у вас нет Q_INVOCABLE - вам просто нужно объявить слот, который затем автоматически известен системе MetaObject. – nerdoc

+0

Это правильный ответ. Небольшой притворство заключается в том, что по умолчанию излучение сигнала является прямым (синхронным) не в очереди (асинхронным), поэтому вы можете считать его «прямым вызовом» в том смысле, что выполнение продолжается в обработчике сигналов, но, как описано, возможно, в несколько обработчиков сигналов, в том порядке, в котором они были связаны. Кроме того, почему возникает такой ошибочный код и какие существуют инструменты для предупреждения о том, что вы подключаетесь к обработчику, который ошибочно возвращает значение? – bootchk

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