Проблема с объектно-ориентированным QSignalMapper

Я пытаюсь настроить расположение сигнальных слотов в PyQt, где сигнал передает много информации. Я хочу использовать QObject в качестве носителя, установив различную информацию, которую я хочу передать, в качестве атрибутов QObject. Теоретически это должно работать — существует перегрузка QSignalMapper.setMapping(), которая принимает отправителя и QObject в качестве аргументов.

Вот сокращенный код:

self.mapper = QtCore.QSignalMapper()
self.timeline.finished.connect(self.mapper.map)
carrier = QtCore.QObject()
carrier.contents = (item1, item2)
self.mapper.setMapping(self.timeline, carrier)
self.portalMapper.mapped.connect(self.report)

def report(self, carrierObject):
    print 'Triggered'

К сожалению, это не работает. Я проследил проблему до функции setMapping методом исключения.

Эта же схема будет отлично работать, если я заменю QObject на int. Это также не имеет ничего общего с атрибутами, которые я добавил в QObject — использование готового QObject вызывает ту же проблему.

Похоже, здесь что-то происходит с этой конкретной перегрузкой функции setMapping. Любые идеи о том, что проблема здесь?


person Grav    schedule 13.06.2017    source источник
comment
Нет смысла использовать QSignalMapper. Просто определите собственный сигнал и отправьте данные напрямую.   -  person ekhumoro    schedule 13.06.2017
comment
Я не знаю, как это сделать, @ekhumoro ... Сигнал, которого ждет мой код, - это стандарт Qt QTimeline.finished, и он должен быть таким, поскольку я жду завершения таймера, прежде чем перейти к следующему шагу. Я мог бы подключить сигнал finished() к функции, которая, в свою очередь, отправляет пользовательский сигнал... но разве это не будет просто повторением цели a QSignalMapper, чтобы получить сигнал и отправить новый сигнал с новым аргументом?   -  person Grav    schedule 13.06.2017
comment
Конечно, но он делает это намного проще. Но действительно ли ваш код вообще должен посылать сигнал? В вашем примере есть только один потребитель сигнала (self), поэтому испускание сигнала кажется полностью избыточным. Все, что вы делаете, это отправляете указатель на объект, а не сами данные (т.е. ничего не копируется). Вы также можете сохранить ссылку на сами данные как атрибут self, а затем получить к ним доступ непосредственно в слоте, подключенном к сигналу finished.   -  person ekhumoro    schedule 13.06.2017


Ответы (1)


Благодаря предложению @ekhumoro полностью отказаться от подхода QSignalMapper и просто создать собственный сигнал. Работал как шарм.

person Grav    schedule 20.06.2017