11
votes

Propagez Qevent personnalisé au widget parent à Qt / Pyqt

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 postEvent () code> au accept () code> et ignorer () code> peut se propager ( qui signifie que chaque QEvent code> sous-classe). p>

J'ai essayé de remplacement customEvents code> au lieu de événements code> mais en vain.

Python h2>

J'ai essayé cela en Python en utilisant PyQt4 (version Qt est 4.6). p>

void Foo::doEvent() {
    QEvent *event = new QEvent(QEvent::User);
    QApplication::postEvent(this->parentWidget(), event);
}


0 commentaires

3 Réponses :


18
votes

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 qapplication :: notify , Fondamentalement, une interrogation avec toutes sortes d'événements. Par exemple, c'est comme ça que c'est fait pour qevent :: WhatsthisClicked : xxx

maintenant, le point mortel: c'est pas effectué pour Événements définis par l'utilisateur (et de nombreux autres événements QT standard explicitement gérés, étant donné que la clause par défaut est la suivante: xxx

et notify_helper 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 (c'est un membre public virtuel) et ajoutez Propagation d'événement pour votre événement).

J'espère que cela aide.


3 commentaires

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)



5
votes

ré-implémentation de qapplication.Notify dans python qui propagerait des événements personnalisés.

dans qt notefy_helper 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 est membre privé. xxx

et au lieu d'utiliser l'instance de qapplication, nous utilisons l'instance de notre sous-classe. xxx


0 commentaires

1
votes

comme alternative à la réponse de Rebus, cet extrait implémente la propagation manuelle d'un événement: xxx

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.

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.

De plus, car cette version utilise SendEvent, les filtres d'événements sur des objets sont correctement appelés.


la raison correspondante personnalisée Les événements ne sont pas propagés, au moins dans qt 4.8, est-ce: xxx

c'est-à-dire, qObject :: événement appelle une autre méthode lorsqu'un événement personnalisé est reçu, puis pause s de son interrupteur instruction et exécute retourne vrai; '. Ce revenir true signale l'appelant (généralement qcoreapplication :: notify que l'événement a été manipulé.


0 commentaires