Gtk+/Glade编程(二)--入门

发布时间:2021-08-05 07:54:00

By unanao





? ?? 本文将
http://zetcode.com/tutorials/gtktutorial/中“First porgrams”一章中内容采用Glade进行界面设计的方法完成“First porgrams”的例子,并且增加一些解释说明。
??? 由于“Simple example”已经在《Gtk+/Glade编程(一)》中实现,这里就不再进行实现。

一、将窗口放置在屏幕中间
主要是窗口属性的设置,在右下角处的“属性”里面进行设置:





这样可以从右下角看到窗口对象的名称被设为:“Center”, 窗口的标题被设为“Center”, 长度为:230, 高度:150。保存并且命名为"center.glade"。

代码为:

#include



int main(int argc, char *argv[])

{

??? GtkBuilder *builder;

??? GtkWidget *window;



??? gtk_init(&argc, &argv);



??? builder = gtk_builder_new();

??? gtk_builder_add_from_file(builder, "center.glade", NULL);

??? window = GTK_WIDGET(gtk_builder_get_object(builder, "center"));



?? //用于关闭窗口,也可以在属性的信号中进行设置

??? g_signal_connect(GTK_WINDOW(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

??? gtk_widget_show(window);



??? g_object_unref(builder);



??? gtk_main();



??? return 0;

}

编译:

??? $gcc -o center center.c `pkg-config --cflags --libs gtk+-2.0`

执行:

??? $./center




?

点击关闭按钮可以正常关闭。

如果不使用Glade进行界面设计及生成,生成窗口并且设置属性的步骤为:

#include



int main(int argc, char *argv[])

{

??? GtkWidget *window;



??? gtk_init(&argc, &argv);



??? window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

??? gtk_window_set_title(GTK_WINDOW(window), "center"); //title is "window"

??? gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);

??? gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);



??? gtk_widget_show(window);



??? gtk_main();???



??? return 0;

}



对比可知:

创建一个组件,

使用Gtk+


需要new一个组件通过set进行属性设置 使用Glade/Gtk+


需要在点击生成窗口,通过属性设置栏进行属性设置利用GtkBuilder将生成的xml文件加入进来即可 虽然感觉Glade/Gtk+的步骤更多,但是并没有直接使用Gtk+繁琐,尤其是Glade可以设计所见即所得的界面,使得编码更加方便,更加高效!



二、应用程序的图标

只需“常规”的设置中,找到“图标”,选择需要设置为图标的图片即可,如下图:




其他的设置没有改变,Gtk+的代码与“
一、将窗口放置在屏幕中间”的代码相同(如果保存的xml的名字进行了改动,需要修改Gtk+中gtk_builder_add_from_file的文件名)

运行结果截图:







左上角出现了我们加入的图标,比上面的图都是“X”漂亮多了!^_^



?

三、加 - 减

3个子组件,1个“标签”, 2个“按钮”


“标签” -->显示一个整数“+” , “-”?> 增加 或减小标签上的数字。 首先设*缑妫

在“顶层”中选 “窗口”

在“容器”中选 “固定的”???? --用于固定按钮和标签,不然加入这些组件的任何一个都会充满整个“窗口”

在控制和显示中选“按钮” 和? “标签”? (标签是黑色的,不带下划线的“Label”)



然后点击 菜单栏最右边的“拖拽并调整工作区部件的大小”,调整“按钮”和“标签的”大小及位置。

设置各个组件的属性:

设置按钮的标签:




?

设置标签的属性:






最后是Gtk+编程:

unanao@debian:~/gui/first-programs$ cat dec_inc.c

#include



gint count = 0;

gchar buf[6];



void increase(GtkWidget *widget, GtkLabel *label)

{

??? count++;

??? sprintf(buf, "%d", count);

??? gtk_label_set_text(label, buf);

}



void decrease(GtkWidget *widget,? GtkLabel *label)

{

??? count--;

??? sprintf(buf, "%d", count);

??? gtk_label_set_text(label, buf);

}



int main(int argc, char *argv[])

{

??? GtkBuilder *builder;

??? GtkWidget *window;

??? GtkWidget *plus;

??? GtkWidget *minus;

??? GtkWidget *result;



??? gtk_init(&argc, &argv);



??? builder = gtk_builder_new();

??? gtk_builder_add_from_file(builder, "dec_inc.glade", NULL);

??? window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));

??? plus = GTK_WIDGET(gtk_builder_get_object(builder, "plus"));

??? minus = GTK_WIDGET(gtk_builder_get_object(builder, "minus"));

??? result = GTK_WIDGET(gtk_builder_get_object(builder, "label"));



??? gtk_widget_show_all(window);



??? g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

??? g_signal_connect(plus, "clicked", G_CALLBACK(increase), result);

??? g_signal_connect(minus, "clicked", G_CALLBACK(decrease), result);



??? gtk_main();



??? return 0;

}

编译:gcc -o dec_inc dec_inc.c `pkg-config --cflags --libs gtk+-2.0`

执行:./dec_inc




?

通过点击“+”和“-”就可以改变右边数字的值了。



四、信号和回调函数

??? 注意这里的回调函数和普通的函数不一样,虽然g_signal_connect只传了一个参数,但是回调函数是两个函数,我开始感觉这个例子写的够笨的, 本来传了一个参数, 回调函数居然写了两个参数, 我就去掉了一个参数, 结果执行结果会报错说传入的参数不是“标签”。

?要使一个按钮执行一个动作,我们需设置信号和信号处理函数之间的连接。可以这

样使用函数来设置连接:



gulong g_signal_connect( gpointer????? *object,

???????????????????????? const gchar?? *name,

???????????????????????? GCallback???? func,

???????????????????????? gpointer????? func_data );



第一个参数是要发出信号的构件,第二个参数是你想要连接的信号的名称,第三个

参数是信号被捕获时所要调用的函数,第四个参数是你想传递给这个函数的数据。





第三个参数指定的函数叫做回调函数:



void callback_func( GtkWidget *widget,

??????????????????? gpointer?? callback_data );



第一个参数是一个指向发出信号的构件的指针,第二个参数是一个指向数据的指针

,就是 g_signal_connect() 函数的最后一个参数。



注意上面回调函数的声明是一种常用的形式,有些构件的特殊信号会用不同的调用

参数。



另一个调用在形式 helloworld 程序中使用,是:



gulong g_signal_connect_swapped( gpointer???? *object,

???????????????????????????????? const gchar? *name,

???????????????????????????????? GCallback??? func,

???????????????????????????????? gpointer???? *slot_object );



g_signal_connect_swapped() 和 g_signal_connect() 相同,只是回调函数只用

一个参数,一个指向 GTK 对象的指针。所以当使用这个函数连接信号时,回调函

数应该是这样的形式



void callback_func( GtkObject *object );



这个对象常是一个构件。然而我们通常不用函数 g_signal_connect_swapped() 设

置连接。它们常被用在只接受一个单独的构件或者对象的回调函数中作为参数,如

同我们的 helloworld 示例中那样。



拥有两个设置信号连接函数的目的是简单的允许回调函数有不同数目的参数。

GTK 库中许多函数仅接受一个单独的构件指针作为其参数,所以对于这些函数你要

用 g_signal_connect_swapped(),然而对你自己定义的函数,你需要附加的数据

提供给你的回调函数。

相关文档

  • 跟女朋友表白的话69句
  • 二年级竞选个人演讲稿
  • 拜占庭帝国灭亡的原因是什么
  • 2020年五四青年节活动策划方案大全5篇
  • 春节期间需要注意预防疲劳驾驶
  • IDC发布全球平板电脑出货量报告,2017年仅出货4960万台,连续13个季度下滑
  • 高中语文期末复习计划分享汇总
  • 七年级下册政治做自尊自信的人同步训练题
  • 中学语文记叙文阅读试题
  • 收录梁朝伟各种经典名言语录
  • Android 输入法框梳理
  • 印前制作招聘_印前制作合同范本
  • stm32 C语言的数据类型说明
  • 有关小学班务工作计划范本
  • 小学英语作文:我们美丽的学校(Our Beautiful School)
  • 向往春常在初一作文
  • 说窗阅读练习及答案说窗现代文阅读理解答案
  • 企业内部财务风险与财务预警模型研究
  • 三星手机怎么通过调低[系统设置/画质]改善游戏体验
  • 普拉提和瑜伽可以同时练吗?瑜伽的副作用
  • 冬季冻疮的防治与常规用药
  • 自学Java到拿到高薪的经历
  • c结构体、c++结构体和c++类的区别以及错误纠正
  • qq怎么取消"禁止"别人加我为好友
  • javaSE-第192篇-方法覆盖规则
  • 蓝桥杯Java 数组输出 算法提高
  • 请问华为荣耀6里的华为云服务能同步备份微信的聊天记录吗
  • 春季能种植什么蔬菜
  • 《魔法灰姑娘》读后感400字(精选3篇)
  • 09预备党员转正总结
  • 猜你喜欢

  • 单位试用员工转正申请书怎么写
  • 开关电流市场前景预测及投资规划分析报告(目录)
  • 2010年四川省成都市七中外地生招生考试数学试卷
  • 黄体酮联合寿胎丸治疗早期先兆流产的临床分析
  • 大连新科科技有限公司企业信用报告-天眼查
  • 压胶服装项目可行性分析报告范本参考
  • 2015-2016学年甘肃省敦煌市郭家堡中学七年级(上)期末英语试卷(解析版)
  • 最新人教版英语八下Unit 2《I’ll help to clean up the city park》课件1
  • 脆皮茄子怎么炸才脆
  • 有你同行真好
  • 二年级上册语文《从森林里带走什么》教案
  • c语言指针详解_每日干货丨C语言指针详解
  • 产后多久来月经正常 产后第一次月经的注意问题
  • 怎样才能将微博里的好友添加到微信中去
  • 2019-2020年九年级数学下学期第三次月考试题
  • 北京源深节能技术有限责任公司宁夏分公司企业信用报告-天眼查
  • 唯美受欢迎的唐诗作品
  • 【优质文档】幼儿园小班健康教案:感冒了-实用word文档 (2页)
  • 2016建筑工程最新规范标准目录
  • 03、创业计划书模版(仅供参考汇编
  • 自强不息成语毛笔书法作品图片
  • GPRS、GSM遥测终端机
  • 计算机软件技术基础4-1 操作系统
  • 2018—2019学年度七年级英语教学工作计划
  • 中国汽车产业竞争力现状分析
  • 人事人员岗位晋升标准考核表
  • 冀教版五年级下册语文试题-第五单元提升练*冀教版含答案
  • 盐城奥祥工艺包装有限公司企业信用报告-天眼查
  • 面部精油
  • 个人工作计划20XX年新学期教师工作计划范文
  • 净土财富(武汉)投资管理有限公司临沧分公司企业信用报告-天眼查
  • 2010年新liyi_7_游戏开发技术(2-综合举例)
  • 2018-2019届高考英语全国卷一二轮复*备考:高考英语专题复*--阅读理解技巧-学术小金刚系列
  • 关于用内外造句
  • 清河县晨尧绒毛制品有限公司企业信用报告-天眼查
  • 小学议论文作文:蜘蛛为什么不吃死苍蝇转载7
  • 四川省高等教育人才培养质量和教学改革项目课程课件共27页
  • 飞得更高_小学六年级作文800字
  • 2018高中历史 第十二课 文艺复兴巨匠的人文风采同步训练2 岳麓版必修3
  • 【精品模板】063TGp_medical_digital_v2医学化工类PPT模板
  • 浅谈化工电气连接部位发热消除方法
  • 倾听小溪的心声作文推荐2篇
  • 电脑版