2010-01-31 9 views
22

GObject संदर्भg_signal_connect_swapped() क्या करता है?

g_signal_connect_swapped (उदाहरण, detailed_signal, c_handler, डेटा) के अनुसार; किसी विशेष ऑब्जेक्ट के लिए एक GCallback फ़ंक्शन को सिग्नल में जोड़ता है। उदाहरण जिस पर सिग्नल उत्सर्जित होता है और हैंडलर को कॉल करते समय डेटा बदल दिया जाएगा।

मुझे इसका अर्थ यह नहीं है। क्या इसका मतलब यह है कि datainstance और instance द्वारा इंगित ऑब्जेक्ट को इंगित करेगा data द्वारा इंगित ऑब्जेक्ट को इंगित करेगा या मैं यहां कोई गलती कर रहा हूं?

यदि पूर्व मामला है तो इसके पीछे तर्क क्या है?

उत्तर

40

आप सही ढंग से समझते हैं।

यह आपको निम्न की तरह चाल करने की अनुमति देता है: आपके पास एक बटन है (चलिए इसे button कहते हैं), जो कि एक और विजेट छिपाने वाला है (चलिए इसे textview पर दबाएं) दबाए रखें।

फिर आप

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

कि प्राप्त करने के लिए कर सकते हैं। जब बटन दबाया जाता है, तो यह 'क्लिक' सिग्नल उत्पन्न करता है, और कॉलबैक को पहले तर्क के रूप में textview के साथ बुलाया जाता है, और button दूसरे के रूप में। इस मामले में कॉलबैक gtk_widget_hide() है जो केवल एक तर्क लेता है, इसलिए दूसरा तर्क अनदेखा कर दिया जाता है, क्योंकि सी कॉलिंग सम्मेलन काम करता है।

यह निम्न जैसा है, लेकिन छोटा है।

static void 
on_button_clicked(GtkButton *button, GtkWidget *textview) 
{ 
    gtk_widget_hide(textview); 
} 

...elsewhere... 

    g_signal_connect(button, 'clicked', G_CALLBACK(on_button_clicked), textview); 

असल में यह आपको एक अतिरिक्त फ़ंक्शन लिखने से बचाता है यदि आप अपने इंटरफ़ेस को कोड-कोड करते हैं। बेशक, कुछ और व्यावहारिक उपयोग हो सकते हैं जिन्हें मैंने कभी नहीं समझा है।

+1

आम तौर पर बच्चों से होने वाली घटनाओं को 'स्वयं' के साथ पहले तर्क के रूप में 'स्वयं' के साथ आने के लिए भी अच्छा होता है, उदाहरण के लिए: 'g_signal_connect_swapped (self-> some_internal_child, "बटन-प्रेस-इवेंट", (GCallback) my_mouse_handler, self) '। ऐसा करने के बिना 'स्वैप किए गए' के ​​माध्यम से प्राप्तकर्ता पक्ष पर एक बदसूरत हस्ताक्षर होने का मतलब होगा कि संभवतः अधिकांश मामलों में दिलचस्प नहीं है, और जिसे आप अक्सर 'स्वयं->' से प्राप्त कर सकते हैं। या कम से कम इस तरह मैंने इसका उपयोग कैसे किया है ... –