设为首页 加入收藏

TOP

初学GtkBuilder界面开发(重新整理)(一)
2014-11-23 23:21:06 来源: 作者: 【 】 浏览:3
Tags:初学 GtkBuilder 界面 开发 重新 整理


初探GtkBuilder界面开发

最初的想法

不能太复杂,但也不能太简单,因为那样没有含量,学不到什么。这次开发的界面至少应该这样:1、有一个主窗体跟若干构件;2、构件之间能够互相交互;3、最好能够明白GtkBuilder可能是怎样实现界面定制的。最后确定的界面大概如图1:

图1 整体界面

点击一下SayHello按钮,文本显示”Hello, World”,点击一下Goodbye按钮退出程序。

根据之前对GTK+信号机制的理解,点击SayHello按钮需要连接一个say_hello函数去响应,点击GoodBye按钮需要连接一个good_bye函数去响应。

绘制界面的注意点

整体界面就不介绍了,很简单,拖一个对话框出来,再拖两个按钮跟一个标签,搞定。最终结果如图2所示:

图2 最终设计界面

图2右边展示的分别是窗体的构件层次(上)和继承对象所关联的信号(下)。

设置关联信号

从图2可以留意到主窗体(标识为dialog-main)的”destroy”事件已经被我们关联到gtk_main_quit函数,这个函数用来退出整个程序。然后我们需要为GoodBye按钮关联good_bye函数。GoodBye按钮的ID是ButtonGoodBye,在GTK+中ID是我们获取子构件对象的唯一标识符号。图3显示了怎么设置ButtonGoodBye的”clicked”事件关联到good_bye函数。

图3 设置GoodBye按钮”clicked”信号

然后SayHello按钮的信号关联。但是在这里我们可以发现,之前的两个信号函数都不需要传递用户数据(即传递的参数为NULL)。在用户数据设置数值,传递的用户数据将会是我们设置数据的字符串形式(我猜测的,未验证)。与SayHello关联的数据say_hello函数需要接收标签控件的对象作为参数,所以在这里我们无法直接连接,只好在源代码处自己做信号关联。

完成界面绘制,保存,我们得到一个helloworld.glade文件(以XML格式保存)。

编写代码

GTK+采用GtkBuilder读取helloworld.glade文件,然后生成界面对象,获取到我们所需的对象,我们就可以释放GtkBuilder对象了。

源代码如下:

  1. /*
  2. * main.c
  3. *
  4. * Created on: 2011-9-17
  5. * Author: kelvin
  6. */
  7. #include /gtk.h>
  8. // good_bye 函数 与 GoodBye按钮的 "cilcked" 事件连接,由 UI 文件自动关联
  9. G_MODULE_EXPORT void good_bye(GtkWidget *widget,gpointer data)
  10. {
  11. gtk_main_quit();
  12. }
  13. // say_hello 函数 与 SayHello按钮的 "clicked" 事件连接,由于需要自己操作 data 参数,所以要手动关联
  14. G_MODULE_EXPORT void say_hello(GtkWidget *widget,gpointer data)
  15. {
  16. GtkLabel * labeltext = (GtkLabel *)data;
  17. if(g_strcmp0(gtk_label_get_label(labeltext), "Hello, World!") == 0)
  18. {
  19. gtk_label_set_label(labeltext, "Very Nice.");
  20. }
  21. else
  22. {
  23. gtk_label_set_label(labeltext, "Hello, World!");
  24. }
  25. }
  26. int main(int argc,char *argv[])
  27. {
  28. GtkBuilder *builder = NULL;
  29. GError *error = NULL;
  30. GtkWidget *window = NULL;
  31. GtkLabel * text = NULL;
  32. GtkButton *button = NULL;
  33. gtk_init(&argc,&argv);
  34. // 初始化GtkBuilder,读取 UI 文件(由glade生成)
  35. builder=gtk_builder_new();
  36. gtk_builder_add_from_file(builder,"helloworld.glade",&error);
  37. // 自动关联已在 UI 文件配置好的信号
  38. gtk_builder_connect_signals(builder, NULL);
  39. // 根据 ID 获取子构件
  40. window=GTK_WIDGET(gtk_builder_get_object(builder,"dialog-main"));
  41. text = GTK_LABEL(gtk_builder_get_object(builder, "label-main"));
  42. button=GTK_BUTTON(gtk_builder_get_object(builder, "ButtonSayHello"));
  43. // 将 SayHello 按钮的 "clicked" 事件与 say_hello 函数关联
  44. gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(say_hello), (gpointer)text);
  45. // 获取到 UI 对象后,GtkBuilder 对象已没有作用,释放了
  46. g_object_unref(G_OBJECT(builder));
  47. // 设置主 UI 界面为可见
  48. gtk_widget_show_all(window);
  49. // 这里才正式运行界面
  50. gtk_main();
  51. return 0;
  52. }

编译阶段

键入下列命令:

gcc `pkg-config --cflags --libs gtk+-2.0` -export-dynamic -o"glade-helloworld" main.c

`pkg-config --cflags --libs gtk+-2.0`: 由pkg-config命令自动加入编译参数跟链接参数。有兴趣的同学可以去掉两边的反引号运行一下看看。

-export-dynamic :采用动态链接库的方法链接。为什么?大家还记不记

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Member Function Templates(成员.. 下一篇复习C语言中的指针

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: