Я пытаюсь настроить расположение сигнальных слотов в 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
. Любые идеи о том, что проблема здесь?
QSignalMapper
. Просто определите собственный сигнал и отправьте данные напрямую. - person ekhumoro   schedule 13.06.2017QTimeline.finished
, и он должен быть таким, поскольку я жду завершения таймера, прежде чем перейти к следующему шагу. Я мог бы подключить сигналfinished()
к функции, которая, в свою очередь, отправляет пользовательский сигнал... но разве это не будет просто повторением цели a QSignalMapper, чтобы получить сигнал и отправить новый сигнал с новым аргументом? - person Grav   schedule 13.06.2017self
), поэтому испускание сигнала кажется полностью избыточным. Все, что вы делаете, это отправляете указатель на объект, а не сами данные (т.е. ничего не копируется). Вы также можете сохранить ссылку на сами данные как атрибутself
, а затем получить к ним доступ непосредственно в слоте, подключенном к сигналуfinished
. - person ekhumoro   schedule 13.06.2017