2017-06-13 1 views
0

J'essaye de configurer un arrangement de slot de signal dans PyQt où le signal transmet beaucoup d'information. Je veux utiliser un QObject en tant que transporteur en définissant les diverses informations que je veux transmettre en tant qu'attributs du QObject. En théorie, cela devrait fonctionner - il y a une surcharge QSignalMapper.setMapping() qui prend un expéditeur et un QObject comme arguments.Problème avec QSignalMapper basé sur les objets

Voici le code réduit:

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' 

Malheureusement, il ne fonctionne pas. J'ai tracé le problème à la fonction setMapping par le processus d'élimination.

Ce même schéma fonctionnera très bien si je change le QObject avec un . Il n'a également rien à voir avec les attributs que j'ai ajoutés au QObject - l'utilisation d'un nouveau-dehors de la boîte QObject provoque le même problème.

Il semble que quelque chose se passe ici avec cette surcharge spécifique de la fonction setMapping. Des idées sur ce que le problème est ici?

+1

L'utilisation de 'QSignalMapper' n'a aucune valeur. Définissez simplement un signal personnalisé et envoyez les données directement. – ekhumoro

+0

Je ne sais pas comment faire ça, @ekhumoro ... Le code que mon code attend est le Qt-standard 'QTimeline.finished', et il doit l'être, car j'attends qu'un timer se termine avant de continuer avec l'étape suivante. Je pourrais connecter le signal 'finished()' à une fonction qui à son tour envoie un signal personnalisé ... mais ne serait-ce pas juste récapituler l'objectif du a QSignalMapper, recevoir un signal et envoyer un nouveau signal avec un nouveau argument? – Grav

+1

Bien sûr - mais il le fait beaucoup plus simplement. Est-ce que votre code a vraiment besoin d'envoyer un signal? Dans votre exemple, il n'y a qu'un seul consommateur du signal ('self'), donc l'émission d'un signal semble être complètement redondante. Tout ce que vous faites est d'envoyer un pointeur vers un objet, pas les données elles-mêmes (c'est-à-dire que rien n'est jamais copié). Vous pourriez aussi bien conserver une référence à la donnée elle-même en tant qu'attribut de 'self', puis y accéder directement dans un slot connecté au signal' finished'. – ekhumoro

Répondre

0

Grâce à la suggestion de @ ekhumoro d'ignorer complètement l'approche QSignalMapper et de créer simplement un signal personnalisé. Travaillé comme un charme.