博客
关于我
GTK+-3.0学习笔记(二)——helloworld
阅读量:299 次
发布时间:2019-03-01

本文共 2485 字,大约阅读时间需要 8 分钟。

GTK+-3.0学习笔记(二)——helloworld

参考自

在[[GTK±3.0学习笔记(一)——Basics]]中,我们创建了一个没有任何功能的简单窗口。

在本文中,我们要完成的工作有:

  1. 完成一个带有按钮的helloworld窗口程序
  2. 通过点击按钮关闭该窗口

首先放上代码

#include 
void activate(GtkApplication * app, gpointer data);void printHello(GtkWidget *button, gpointer data);int main(int argc, char *argv[]){ // 创建app实例 GtkApplication *app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE); // 链接到activate函数 g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); // 运行 int status = g_application_run(G_APPLICATION(app), argc, argv); // 销毁实例 g_object_unref(app); return status;}void activate(GtkApplication * app, gpointer data){ // 第一步,创建窗口 GtkWidget *window = gtk_application_window_new(app); gtk_window_set_title(GTK_WINDOW(window), "Hello, world!"); gtk_window_set_default_size(GTK_WINDOW(window), 200, 300); // 第二步,创建按钮容器 GtkWidget *button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); gtk_container_add(GTK_CONTAINER(window), button_box); // 第三步,创建按钮 GtkWidget *button = gtk_button_new_with_label("Hello world!"); // 绑定点击事件 g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL); g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window); // 添加按钮 gtk_container_add(GTK_CONTAINER(button_box), button); // 第四步,展示窗口 gtk_widget_show_all(window);}void printHello(GtkWidget *button, gpointer data){ g_print("Hello, world!\n");}

进行编译后运行

得到如下的结果:![[GTK_fig1.png]]

点击该按钮,会在控制台输出helloworld,并关闭窗口、退出程序。

首先,main函数的作用仍然是创建实例并运行程序,直接看activate函数对应的代码:

active函数做了这几件事情:

  1. 创建窗口
  2. 创建按钮box
  3. 创建按钮
  4. 展示窗口

创建窗口已经讲过了, 不再重复

创建按钮box:

GtkWidget *button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);gtk_container_add(GTK_CONTAINER(window), button_box);

其中的GTK_ORIENTATION_HORIZONTAL表示该按钮容器中的按钮是水平排列的

例如再添加几个按钮后,效果是:
![[GTK_fig2.png]]
GTK_ORIENTATION_HOriZONTAL改为GTK_ORIENTATION_VERTICAL后,效果变为
![[GTK_fig3.png]]

创建好按钮容器后,需要将其添加至窗口中

创建按钮:

// 第三步,创建按钮GtkWidget *button = gtk_button_new_with_label("Hello world!");// 绑定点击事件g_signal_connect(button, "clicked", G_CALLBACK(printHello), NULL);g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);// 添加按钮gtk_container_add(GTK_CONTAINER(button_box), button);

使用gtk_button_new_with_label来创建按钮

然后进行点击事件的绑定

  • g_signal_connectg_signal_connect_swapped的区别:
    g_signal_connect给CALLBACK函数传递两个参数,第一个参数是触发信号的主体,第二个参数是传递的数据
    g_signal_connect_swapped只传递一个参数

在以上的代码中,将g_signal_connect_swapped替换为g_signal_connect,则因为函数gtk_widget_destroy只有一个参数,因此只会接受到第一个参数:触发信号的主体,因此关闭的不会是窗口,而是按钮本身

参考博文:

转载地址:http://wyao.baihongyu.com/

你可能感兴趣的文章
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>