GTK+简介

GTK+(Gnome Toolkit+)最初是为GIMP(GNU Image Manipulation Program)写的,在开发早期GIMP版本时,Peter MattisSpencer Kimball创建了GTK(GIMP Toolkit)作为Motif收费工具包的替代。当GTK获得了面向对象特性和可扩展性后,才变为了GTK+

GTK+特点

稳定、跨平台、多语言绑定、接口丰富、与时俱进、算法丰富、移动嵌入式应用广泛.

学习手册

GTK程序简介

使用gcc编译时加上pkg-config --cflags --libs gtk+-2.0,或者直接使用makefile编译

例:
gcc demo.c -o demo `pkg-config --cflags --libs gtk+-2.0`
自动获得预处理参数,如宏定义、头文件位置
自动获得链接参数,如库、依赖库位置、文件名及其它参数

GTK程序基本框架

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);		// 初始化
    // 代码区
    gtk_main();					// 主事件循环
    return 0;
}

分析:

<gtk/gtk.h>			// 头文件,包括了GTK+所有控件、变量、函数和结构的声明
gtk_init()			// 必须在控件定义之前使用,参数由命令中解析出来并送到程序中。主要作用为设立GTK+运行环境,自动完成一些必要的初始化工作
gtk_main()			// 程序运行停在这里等待事件(如键盘或鼠标事件)的发生,等待用户操作窗口。这个函数在所有GTK+程序中都要调用
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL)	// GtkWidget是GTK+控件类型,GtkWidget*能指向任何控件的指针类型
gtk_window_new()	// 创建一个窗口并返回这个窗口的控件指针
GTK_WINDOW_TOPLEVEL	// 指明窗口类型为最上层主窗口
gtk_widget_show(window)	// 显示上一步创建的窗口控件

控件介绍

1.控件是对数据和方法的封装。控件有自己的属性和方法,属性是指控件的特征,方法是指控件的一些简单可见的功能。

2.控件的分类:容器控件与非容器控件。

容器控件:可以容纳别的控件。容器控件分为两类,一类只能容纳一个控件,如窗口、按钮;另一类则能容纳多个控件,如布局控件。

非容器控件:不可以容纳别的控件,如标签、行编辑。

控件类型的转换

使用控件接口时,一定要注意参数类型是否匹配。

窗口

// 窗口创建
GtkWidget *window = gtk_window_new(GtkWindowType);
GtkWindowType是一个枚举,具体有两种情况:
GTK_WINDOW_TOPLEVEL		// 有边框
GTK_WINDOW_POPUP		// 无边框
    
// 标题设置
void gtk_window_set_title(GtkWindow *window, const gchar *title);

// 窗口最小尺寸设置
void gtk_widget_set_size_request(GtkWidget *widget,gint width,gint height);

// 窗口伸缩设置
void gtk_window_set_resizable(GtkWindow *window, gboolean resizable);

// 显示或隐藏所有控件
void gtk_widget_show_all(GtkWidget *widget);
void gtk_widget_hide_all(GtkWidget *widget);

// 窗口在显示器位置设置
void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position);
position常用有四种情况:
GTK_WIN_POS_NONE			// 不固定
GTK_WIN_POS_CENTER			// 居中
GTK_WIN_POS_MOUSE			// 出现在鼠标位置
GTK_WIN_POS_CENTER_ALWAYS	//窗口总是居中

实例

#include <gtk/gtk.h> // 头文件
 
int main(int argc,char *argv[])
{
    gtk_init(&argc, &argv);  // 初始化
// 创建顶层窗口
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// 设置窗口标题
    gtk_window_set_title(GTK_WINDOW(window), "Window");
// 设置窗口在显示器中的位置为居中
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
// 设置窗口最小尺寸
    gtk_widget_set_size_request(window, 400, 300);
// 固定窗口的大小
	gtk_window_set_resizable(GTK_WINDOW(window), FALSE); 

// "destroy" 和 gtk_main_quit 连接,关闭窗口时程序自动停止,否则需要按ctrl+c
	g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
	gtk_widget_show_all(window); 	// 显示窗口全部控件
 	//gtk_widget_hide_all(window); 	// 隐藏窗口

    gtk_main();  // 主事件循环
    return 0;
}

窗口截图:

wswzfe.jpg

按钮

// 创建一个带内容的按钮
GtkWidget* gtk_button_new_with_label(const gchar *label);

// 获得按钮文本内容
const gchar* gtk_button_get_label(GtkButton *button );

// 将控件添加到窗口容器
void gtk_container_add(GtkContainer *container, GtkWidget *widget);
container:容纳控件的容器;widget:要添加的控件

实例

#include <gtk/gtk.h>	// 头文件

int main(int argc, char *argv[])
{
	gtk_init(&argc, &argv);		// 初始化

	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	// 创建顶层窗口
	// 设置窗口边框宽度(窗口里的控件与窗口边框间隔为15)
	gtk_container_set_border_width(GTK_CONTAINER(window), 15);

	// 创建按钮,文本信息为"Hello World"
	GtkWidget *button = gtk_button_new_with_label("Hello World");
	const char *str = gtk_button_get_label(GTK_BUTTON(button));	// 获得按钮的内容
	printf("str = %s\n", str);									// 打印到终端

	// 把按钮放入窗口(窗口也是一种容器)
	gtk_container_add(GTK_CONTAINER(window), button);

	// 显示控件有两种方法:逐个显示,全部显示
	// gtk_widget_show(button);
	// gtk_widget_show(window);
	gtk_widget_show_all(window);	// 显示窗口全部控件

	gtk_main();						// 主事件循环

	return 0;
}

运行截图:

mjOTRV.jpg

信号与回调函数

GTK+采用信号与回调函数处理窗口外部传来的事件、消息或信号。当信号发生时,程序自动调用为信号连接的回调函数。

// 窗口关闭时触发的常用信号
destroydelete-event
// 操作按钮触发的常用信号
clickedpressedreleased
    
// 信号与回调函数的连接
gulong g_signal_connect(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data);
instance	:	信号发出者
detailed_signale	:	要连接的信号名称
c_handler	:	回调函数名称,需要使用G_CALLBACK进行转换
data		:	传递给回调函数的参数
// 信号连接函数的写法
g_signal_connect(button, "pressed", G_CALLBACK(callback), NULL);
// 回调函数的定义
void callback(GtkButton *button, gpointer user_data);
button	:	信号发出者
user_data	:	传递给回调函数的参数

实例

#include <gtk/gtk.h>	// 头文件

// 按钮按下的处理函数, gpointer 相当于 void *
void deal_pressed(GtkButton *button, gpointer user_data)
{
	// 获得按钮的文本信息
	const gchar *text = gtk_button_get_label( button );
	// g_print() 相当于C语言的 printf(), gchar相当于char
	g_print("button_text = %s; user_data = %s\n", text, (gchar *)user_data);
}

int main( int argc,char *argv[] )
{
	gtk_init(&argc, &argv);		// 初始化

	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建顶层窗口
	// 设置窗口边框的宽度(窗口里的控件与窗口边框间隔为15)
	gtk_container_set_border_width(GTK_CONTAINER(window), 15);

	/* 当窗口关闭时,窗口会触发destroy信号,
	 * 自动调用gtk_main_quit()结束程序运行。
	 */
	g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

	GtkWidget *button = gtk_button_new_with_label("Hello GTK+"); // 创建按钮
	gtk_container_add(GTK_CONTAINER(window), button);	// 把按钮放入窗口(窗口也是一种容器)

	/* 按钮按下(pressed)后会自动调用deal_pressed()
	 * "is pressed"是传给deal_pressed()的数据
	 */
	g_signal_connect(button, "pressed", G_CALLBACK(deal_pressed), "is pressed");

	gtk_widget_show_all(window);	// 显示窗口全部控件

	gtk_main();		// 主事件循环

	return 0;
}

运行截图:

5s1Cpu.jpg

文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。