У меня проблема с использованием механизма Qt signal/slot в PySide, когда я хочу отправить None.
Предположим, у меня есть класс с именем Calculator (подкласс QObject), который может выполнять определенные вычисления, результатом которых может быть что угодно, то есть любой тип объекта Python или даже None. Мне нужны экземпляры класса Calculator, чтобы иметь возможность сигнализировать результат некоторым потребительским объектам (подклассам QObject).
Что у меня было:
class Calculator(QObject):
finished = PySide.QtCore.Signal(object) # object means it can transmit anything
def calc(self):
... # calculation of the result
self.finished.emit(result)
class Consumer(QObject):
def __init__(self, calculator):
...
calculator.finished.connect(self.consume)
def consume(self, result): # do something with the result
...
Это работает нормально, за исключением ситуации, когда результатом является None. Затем программа вылетает при отправке сигнала. Кажется, что None не является объектом Python (что может быть правдой, я не настолько хорошо разбираюсь в языковых стандартах).
Теперь у меня есть обходной путь, используя два сигнала:
finished = PySide.QtCore.Signal((),(object,))
и:
def calc(self):
... # calculation of the result
if result is None:
self.finished.emit()
else:
self.finished[object].emit(result)
Это решение работает, но оно сложное, поскольку требует, чтобы объекты-потребители дважды связывали сигнал. Либо на два слота, либо на один слот с одним аргументом по умолчанию, равным None.
class Consumer(QObject):
def __init__(self, calculator):
...
calculator.finished.connect(self.consume)
calculator.finished[object].connect(self.consume)
def consume(self, result=None): # do something with the result
...
Это сложно и чревато ошибками при создании множества различных потребительских классов. Я думаю, что эта проблема аналогична PyQt, с той разницей, что альтернативные сигналы определяются с использованием списков [], [object]
, а не кортежей (),(object,)
.
Мой вопрос: есть ли какое-нибудь простое решение этой проблемы? В идеале с одним сигналом?
None
(что, безусловно, является добросовестным объектом Python). Однако я тестировал с помощью PySide-1.2.1 и не смог воспроизвести вашу проблему. Я также никогда не видел такой проблемы в PyQt. Так что либо вы делаете что-то не так где-то в своем коде, либо это ошибка в версии PySide, которую вы используете. - person ekhumoro   schedule 14.01.2014