6
votes

Comment attachez-vous un menu contextuel à un bouton d'en-tête de colonne dans GTK2 à l'aide de PygObject?

Je veux contempler un menu contextuel lorsque l'utilisateur clique sur le bouton droit de la souris sur la ligne d'en-tête d'un gtk.treeview . Dans gtk3, gtk.treeviewcolumn a une méthode get_button (), qui facilite la tâche; Joignez simplement le menu sur le bouton et connectez-le à un événement «cliqué». Cependant, dans GTK2, cela ne fonctionnera pas. Vous ne pouvez appeler qu'une méthode get_widget () , qui ne renvoie aucune si vous n'avez pas défini de widget via set_widget () . J'ai essayé de mettre un gtk.label avec le nom de la colonne dans un gtk.eventbox et définissez-le comme widget après la connexion du eventbox à Un rappel pour le "button_press_event", en cliquant dessus, il ne génère pas l'événement.

J'ai essayé de faire quelque chose comme ce qui est répertorié ici mais faisant get_parent () sur le widget de colonne ne renvoie aucun et n'atteint jamais le bouton car leur code implique.

Quelles solutions ont trouvé des gens pour cela?


2 commentaires

Je devrais clarifier cela par "dans GTK2, cela ne fonctionnera pas", j'aurais dû dire: "Dans GTK2, la méthode get_button () n'a pas été mise en œuvre.


Maintenant, je trouve aussi que menu.attach_to_widget () et menu.popup () apparemment ne sont pas introspects dans GTK2. Selon le Site PygObject , dans gtk3 menu.popup () a été mis en œuvre à travers un remplacement, mais je ne trouve pas de documentation sur la manière dont cela a été fait.


3 Réponses :


0
votes

Cela semble en effet compliqué, j'avais un coup d'œil sur le source . Apparemment, le (code> parent Trick fonctionne (et renvoie l'objet d'alignement), mais votre étiquette personnalisée est ajoutée uniquement au bouton après que l'arboresviewcolumn ait été réalisée, donc avant que l'attribut parent Séjours Aucune Donc, Probablement Dernière Dernière dernière fois que votre commande Show The TreeView, vous devriez être en mesure de récupérer les parents (bouton-> hbox-> alignement-> étiquette) et peut joindre votre gestionnaire au signal. < / p>


0 commentaires

3
votes

C'est assez facile en fait, mais vous avez besoin de quelques hacks.

Vous devez d'abord forcer GTK pour créer un bouton d'en-tête pour le GTKTREEEVIEWCOLUMN: P>

    def button_release_event(button, event):
        if event.button == 3:
           menu.popup(event)

    widget.connect('button-release-event', button_release_event)


1 commentaires

J'écris à Perl, mais cette même approche fonctionne. Merci! De note, je dois ajouter la colonne à l'arborescence avant d'appeler get_widget.



0
votes

J'aime des exemples de travail sur s.o, j'ai donc décidé de poster un. Tous les crédits sont pour @johan Dahlin! XXX

Happy Piratage!


0 commentaires