2010-01-31 8 views
22

Selon référence GObjectQue fait g_signal_connect_swapped()?

de g_signal_connect_swapped (instance, detailed_signal, c_handler, données); connecte une fonction GCallback à un signal pour un objet particulier. L'instance sur laquelle le signal est émis et les données seront permutées lors de l'appel du gestionnaire.

Je ne comprends pas très bien ce que cela signifie. Est-ce que cela signifie que le data pointera vers l'objet pointé par instance et instance pointera vers l'objet pointé par data ou est-ce que je fais une erreur ici?

Si ancien est le cas alors quelle est la logique derrière cela?

Répondre

40

Vous comprenez correctement.

Cela vous permet de faire des trucs comme suit: Vous avez un bouton (appelons-le button), qui est censé cacher un autre widget (appelons-le textview) lorsqu'il est pressé.

Vous pouvez alors faire

g_signal_connect_swapped(button, 'clicked', G_CALLBACK(gtk_widget_hide), textview); 

pour y parvenir. Lorsque le bouton est pressé, il génère le signal «cliqué», et le rappel est appelé avec textview comme premier argument, et button comme le second. Dans ce cas, le callback est gtk_widget_hide() qui ne prend qu'un argument, donc le second argument est ignoré, parce que c'est ainsi que fonctionne la convention d'appel C.

C'est la même chose que ce qui suit, mais plus court. Fondamentalement, il vous évite d'avoir à écrire une fonction supplémentaire si vous codez votre interface manuellement. Bien sûr, il peut y avoir un usage beaucoup plus pratique que je n'ai jamais compris.

+1

En général, les événements des enfants appellent des gestionnaires avec 'self' comme premier argument, par exemple:' g_signal_connect_swapped (self-> some_internal_child, "bouton-press-event", (GCallback) mon_mouse_handler, self) '. Faire cela sans "swappé" signifierait avoir une signature laide du côté réception avec un 1er argument qui n'est probablement pas intéressant dans la majorité des cas, et que vous pouvez souvent obtenir de 'self->' de toute façon. Ou du moins c'est comme ça que j'ai utilisé jusqu'ici ... –