在 GTK 2 中,数据类型主要基于 GLib(GTK 的基础库),提供了一套跨平台的数据类型和工具函数。以下是 GTK 2 中常用的数据类型及其说明:
基础数据类型
(1) 整数类型
类型 |
说明 |
对应 C 类型 |
示例 |
gint |
带符号整数 |
int |
gint x = 42; |
guint |
无符号整数 |
unsigned int |
guint y = 100; |
gint8, gint16, gint32, gint64 |
固定位宽整数 |
int8_t, int16_t, … |
gint32 val = 123456; |
guint8, guint16, guint32, guint64 |
无符号固定位宽整数 |
uint8_t, uint16_t, … |
guint16 port = 8080; |
glong |
长整数 |
long |
glong big = 1L << 32; |
gulong |
无符号长整数 |
unsigned long |
gulong flags = 0xFFFF; |
(2) 浮点类型
类型 |
说明 |
对应 C 类型 |
示例 |
gfloat |
单精度浮点数 |
float |
gfloat pi = 3.14f; |
gdouble |
双精度浮点数 |
double |
gdouble e = 2.71828; |
(3) 布尔类型
类型 |
说明 |
对应 C 类型 |
示例 |
gboolean |
布尔值 |
int(TRUE/FALSE) |
gboolean is_ok = TRUE; |
(4) 字符和字符串
类型 |
说明 |
对应 C 类型 |
示例 |
gchar |
字符 |
char |
gchar c = ‘A’; |
guchar |
无符号字符 |
unsigned char |
guchar byte = 0xFF; |
gchar |
字符串(UTF-8) |
char |
gchar *str = “Hello”; |
gunichar |
Unicode 字符 |
uint32_t |
gunichar uc = L’你’; |
指针和内存管理
类型 |
说明 |
示例 |
gpointer |
通用指针(类似 void*) |
gpointer data = malloc(100); |
gconstpointer |
只读通用指针 |
gconstpointer const_data = “Immutable”; |
GObject |
GTK 对象基类指针 |
GObject obj = G_OBJECT(button); |
内存管理函数:
gpointer g_malloc(gsize n_bytes);
void g_free(gpointer mem);
gchar g_strdup(const gchar str);
容器和数据结构
(1) 动态数组(GArray)
GArray *array = g_array_new(FALSE, FALSE, sizeof(gint));
g_array_append_val(array, 42);
gint val = g_array_index(array, gint, 0);
g_array_free(array, TRUE);
(2) 链表(GSList, GList)
GSList *list = NULL;
list = g_slist_append(list, "Item1");
list = g_slist_remove(list, "Item1");
g_slist_free(list);
(3) 哈希表(GHashTable)
GHashTable *hash = g_hash_table_new(g_str_hash, g_str_equal);
g_hash_table_insert(hash, "key", "value"); // 插入键值对
gchar *val = g_hash_table_lookup(hash, "key"); // 查找
g_hash_table_destroy(hash); // 释放内存
GTK 对象类型
类型 |
说明 |
示例 |
GtkWidget |
所有控件的基类 |
GtkWidget button = gtk_button_new(); |
GtkWindow |
窗口对象 |
GtkWindow win = GTK_WINDOW(top_level); |
GtkButton |
按钮控件 |
GtkButton btn = GTK_BUTTON(button); |
GtkEntry |
输入框 |
GtkEntry entry = GTK_ENTRY(text_input); |
类型转换宏:
GtkButton *btn = GTK_BUTTON(widget);
if (GTK_IS_BUTTON(widget)) { ... }
信号和事件相关类型
类型 |
说明 |
示例 |
gulong |
信号连接ID |
gulong handler_id = g_signal_connect(…); |
GCallback |
回调函数类型 |
void callback(GtkWidget*, gpointer); |
GdkEvent |
事件结构体 |
GdkEventButton event = (GdkEventButton*)ev; |
信号连接示例:
g_signal_connect(button, "clicked", G_CALLBACK(on_click), NULL);