Poing, mes excuses pour la longueur de la question.
Je suis en train de se propager un événement personnalisé Qt de widgets enfants à un widget parent supérieur afin de déclencher une action en fonction du type d'événement au lieu de lier des signaux. P >
docs Qt suggère que chaque événement affiché avec J'ai essayé de remplacement J'ai essayé cela en Python en utilisant PyQt4 (version Qt est 4.6). p> postEvent () code> au
accept () code> et
ignorer () code> peut se propager ( qui signifie que chaque
QEvent code> sous-classe). p>
customEvents code> au lieu de
événements code> mais en vain.
Python h2>
void Foo::doEvent() {
QEvent *event = new QEvent(QEvent::User);
QApplication::postEvent(this->parentWidget(), event);
}
3 Réponses :
J'ai passé du temps à parcourir la source QT afin de répondre à votre question et de ce que j'ai finalement proposé, c'est que: La propagation des événements aux widgets parent est effectuée par maintenant, le point mortel: c'est et J'espère que cela aide. p> p> qapplication :: notify code> , Fondamentalement, une interrogation code> code> avec toutes sortes d'événements. Par exemple, c'est comme ça que c'est fait pour
qevent :: WhatsthisClicked code>:
notify_helper code> ne propage pas les événements. Donc, ma réponse est la suivante: apparemment, les événements définis par l'utilisateur ne sont pas propagés aux widgets des parents, vous devrez le faire vous-même (ou mieux: remplacement
qapplication :: notify code> (c'est un membre public virtuel) et ajoutez Propagation d'événement pour votre événement). P>
Source pertinente ici
Le problème est que QObject :: événement est protégé et notify_helper est privé, comment est-il possible d'ajouter une propagation des événements?
À propos de mon commentaire précédent, appeler la classe de base est la solution qapplication :: notify (widget, événement)
ré-implémentation de dans qt et au lieu d'utiliser l'instance de qapplication, nous utilisons l'instance de notre sous-classe. p> qapplication.Notify code> dans python qui propagerait des événements personnalisés.
notefy_helper code> S'assure que les filtres d'événements sont appelés (qaplications et récepteurs ) mais j'ai sauté que comme je n'en ai pas besoin d'eux et
notefy_helper code> est membre privé. p>
comme alternative à la réponse de Rebus, cet extrait implémente la propagation manuelle d'un événement: Notez que cela utilise SendEvent et doit donc être appelé sur le fil que l'objet cible vit sur . Cette limitation peut être résolue avec plus d'indirection. P> Notez que vous devrez appeler _manual_propagate / au lieu de / SendezEvent vous-même. Il s'agit d'une version "moins automatique" de la technique de Rebus. P> De plus, car cette version utilise SendEvent, les filtres d'événements sur des objets sont correctement appelés. P> la raison correspondante personnalisée Les événements ne sont pas propagés, au moins dans qt 4.8, est-ce: p> c'est-à-dire,
qObject :: événement code> appelle une autre méthode lorsqu'un événement personnalisé est reçu, puis
pause code> s de son
interrupteur code> instruction et exécute
retourne vrai; ' code>. Ce
revenir true code> signale l'appelant (généralement
qcoreapplication :: notify code> que l'événement a été manipulé. P> p>