GTK+-3.0学习笔记(二)——helloworld
参考自官方文档
在[[GTK±3.0学习笔记(一)——Basics]]中,我们创建了一个没有任何功能的简单窗口。
在本文中,我们要完成的工作有:
- 完成一个带有按钮的helloworld窗口程序
- 通过点击按钮关闭该窗口
首先放上代码
#include <gtk/gtk.h>
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函数做了这几件事情:
- 创建窗口
- 创建按钮box
- 创建按钮
- 展示窗口
创建窗口已经讲过了, 不再重复
创建按钮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_connect
、g_signal_connect_swapped
的区别:
g_signal_connect
给CALLBACK函数传递两个参数,第一个参数是触发信号的主体,第二个参数是传递的数据
而g_signal_connect_swapped
只传递一个参数
在以上的代码中,将g_signal_connect_swapped
替换为g_signal_connect
,则因为函数gtk_widget_destroy
只有一个参数,因此只会接受到第一个参数:触发信号的主体,因此关闭的不会是窗口,而是按钮本身
参考博文:g_signal_connect_swapped的作用是什么?