2010-01-31 8 views
22

Nach GObject ReferenzWas macht g_signal_connect_swapped()?

g_signal_connect_swapped (Beispiel detailed_signal, c_handler, Daten); verbindet eine GCallback-Funktion mit einem Signal für ein bestimmtes Objekt. Die Instanz, an der das Signal ausgegeben wird, und Daten werden beim Aufruf des Handlers ausgetauscht.

Ich verstehe nicht ganz, was das bedeutet. Bedeutet dies, dass data auf das Objekt zeigt, auf das zeigt, undauf das Objekt zeigt, auf das data zeigte, oder mache ich hier einen Fehler?

Wenn früher der Fall ist, was ist dann die Logik dahinter?

Antwort

40

Sie verstehen richtig.

Dies ermöglicht Ihnen, Tricks wie die folgenden zu tun: Sie haben eine Schaltfläche (nennen wir es button), die ein anderes Widget verstecken soll (nennen wir es textview), wenn gedrückt.

können Sie dann tun

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

das zu erreichen. Wenn die Taste gedrückt wird, erzeugt es das "angeklickte" Signal und der Rückruf wird mit textview als das erste Argument und button als das zweite Argument aufgerufen. In diesem Fall ist der Callback gtk_widget_hide(), der nur ein Argument benötigt, so dass das zweite Argument ignoriert wird, weil so die C-Aufrufkonvention funktioniert.

Es ist das gleiche wie das Folgende, aber kürzer.

Im Grunde erspart es Ihnen, eine zusätzliche Funktion zu schreiben, wenn Sie Ihre Schnittstelle handcodieren. Natürlich kann es einen viel praktischeren Nutzen geben, den ich nie verstanden habe.

+1

Es ist auch gut für im Allgemeinen Ereignisse von Kindern aufrufen Handler mit "Selbst" als erstes Argument, z. B .: 'g_signal_connect_swapped (Self> einige_interne_child," button-press-event ", (GCallback) my_mouse_handler, self)'. Dies ohne "Tauschen" zu tun, würde bedeuten, eine hässliche Unterschrift auf der Empfangsseite zu haben, mit einem ersten Argument, das in den meisten Fällen wahrscheinlich nicht interessant ist und das man oft von "selbst"> bekommen kann. Oder zumindest habe ich das bisher genutzt ... –