第一次尝试使用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” 也行,这两个函数的实现机制到底有何不同,有待高手指教。