第一次嘗試使用gtk的時候,被無窮無盡繁雜的代碼整暈了,剛剛才發現原來用glade可以如此方便的生成GUI,完全和代碼剝離開,即使要修改界面,也用不著再次編譯,的確很方便。
如何使用glade,網上有很多教程,我現在講一點遇到的困難吧。
在為各種signal添加handler的時候,有兩點要注意。
首先handler應該與signal的回調函數的形式完全一致,包括函數名,參數類型,參數個數,返回類型;這個可以在gtk的用戶手冊里查找(順便說一句,ubuntu上的小工具devhelp很方便)。
第二點,也是困擾我很久的一點:signal和hanlder綁定的問題。
c代碼中綁定signal和handler的方式有兩種:
gtk_builder_connect_signals和gtk_builder_connect_signals_full。
前者是自動綁定,這個函數會使用GModule,GLib的一部分,動態加載模塊來查詢應用程序符號表(函數名,變量名等等),尋找應用程序中能夠與Glade中指定的回調函數名相符的函數,然后連接到信號。但是 gtk_builder_connect_signals 只能工作在C下,所以如果你的編譯器是g++,僅靠這樣是無法binding的。我覺得這又是name mangling的問題(可惡的微軟,偏要再搞一套標準,搞出這么多麻煩……),所以為了避開麻煩,可以強制以C的方式調用handler,即在hangler前加上extern "C" 就可以了,在ubuntu下g++試驗通過。
后者就是手動綁定singal和hanler,我試用的時候發現不加extern “C” 也行,這兩個函數的實現機制到底有何不同,有待高手指教。
浙公網安備 33010602011771號