linux GTK教程(消息机制/标签/按钮/图像/文本/对话框/菜单/容器)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

 GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。

1.GTK安装

2.一个简单的GTK窗口程序

复制代码
#include <stdio.h>
#include <gtk/gtk.h>

int main(int argc, char **argv)
{
    GtkWidget *window;
    gtk_init(&argc,&argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//参数表示创建主窗口
    
    g_signal_connect(G_OBJECT(window),"delete event",G_CALLBACK(gtk_main_quit),NULL);//空间和消息函数创建关联
    gtk_window_set_title(GTK_WINDOW(window),"test");
    gtk_widget_show(window);
    
    gtk_main();
    
    return 0;
}
复制代码

g_signal_connect()函数原型:

复制代码
gulong g_signal_connect(gpointer object, const gchar* name, GCallback func, gpointer func_data);
//object指向产生消息的控件
//name为消息名称
//func为发生消息后的回调函数
//func_data是床递给消息处理函数func的参数

//func
void callback_func(GtkWidget *widget, gpointer func_data);
//widget指向接收消息的控件
//func_data是传递的消息

//另外一个connect函数,它不提供消息的传送
gulong g_signal_connect_swapped(gpointer object,const gchar *name,GCallback func, gpointer slot_object);
复制代码

3.为窗口增加一个按钮控件

复制代码
//一般按钮的创建函数

GtkWidget* gtk_button_new(void)
//空按钮

GtkWidget* gtk_button_new_with_label(const gchar* label)
//带标签的

GtkWidget* gtk_button_new_with_mnemonic(congst gchar* label)
//带助记符的

GtkWidget* gtk_button_new_from_stock(const gchar* stock_id)
//基于固定項按钮--->由一个图标,一个文本标签和一个可选的快捷键组成

//其他函数

const gchar *gtk_button_get_label(GtkButton *button)
//获取标签文本

void gtk_button_set_label(GtkButton *button)

gboolean gtk_button_get_focus_on_click(GtkButton *button)
//获取按钮焦点
gboolean gtk_button_set_focus_on_click(GtkButton *button)
GtkWidget* gtk_button_get_image(GtkButton *button)
//获取按钮图像

GtkWidget* gtk_button_set_image(GtkButton *button)
复制代码

  用户没有点击按钮,但是需要执行点击按钮时所对应的动作。一种方法是直接调用按钮的c l i c k e d信号的回调函数,另一种方法就是调用一个函数,让这个函数引发c l i c k e d信号,这样自然就会调用这个回调函数。对鼠标按下、松开、进入和离开等信号也有类似的函数。如下:

复制代码
//对给定按钮构件b u t t o n引发p r e s s e d信号,效果是直接调用p r e s s e d信号对应的回调函数:
void gtk_button_pressed (GtkButton *button);
//对给定按钮构件b u t t o n引发r e l e a s e d信号:
void gtk_button_released (GtkButton *button);
//对给定按钮构件b u t t o n引发c l i c k e d信号:
void gtk_button_clicked (GtkButton *button);
//对给定按钮构件b u t t o n引发e n t e r信号:
void gtk_button_enter (GtkButton *button);
//对给定按钮构件b u t t o n引发l e a v e信号:
void gtk_button_leave (GtkButton *button);
复制代码

例子:

View Code

4.标签创建和属性设置

复制代码
GtkWidget *gtk_label_new(const char *str)
GtkWidget *gtk_laber_new_with_mnemonic(const char *str)
//第二个创建了一个带助记符的标签

void gtk_label_set_text(GtkLaber *label, const char *str)
//改变标签文本

const gchar* gtk_label_get_text(GtkLabel *label)
//获取标签当前文本

void gtk_label_set_justify(...)
//设置对齐方式

void gtk_label_set_line_wrap(..)
//激活自动换行

void gtk_label_set_pattern(..)
//加下划线
复制代码

例子:

View Code

5.开关按钮,复选按钮,单选按钮

复制代码
//创建开关按钮
GtkWidget *gtk_toggle_button_new(void)
GtkWidget *gtk_toggle_button_new_with_label(const gchar *label)
GtkWidget *gtk_toggle_button_new_with_mnemonic(const gchar *label)

//检查按钮状态
gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button)

//设置按钮状态
void gtk_toggle_button_set_active(GtkToggleButton *toggle_button, gboolean is_active)
复制代码
//创建复选按钮,检查函数同上
GtkWIdget *gtk_check_button_new(void)
GtkWIdget *gtk_check_button_new_with_label(const gchar* label)
GtkWIdget *gtk_check_button_new_with_mnemonic(const gchar* label)
复制代码
//创建单选按钮
GtkWidget *gtk_radio_button_new( GSList *group );
GtkWidget *gtk_radio_button_new_from_widget( GtkRadioButton *group );
GtkWidget *gtk_radio_button_new_with_label( GSList *group,const gchar *label );
GtkWidget* gtk_radio_button_new_with_label_from_widget( GtkRadioButton *group,const gchar *label );
GtkWidget *gtk_radio_button_new_with_mnemonic( GSList *group,const gchar *label );
GtkWidget *gtk_radio_button_new_with_mnemonic_from_widget( GtkRadioButton *group,const gchar *label );

//单选按钮的属性

//创建组获取组标识
GSList *gtk_radio_button_get_group(GtkRadioButton *radio_button)

//设置组中的单选按钮
GSList *gtk_radio_button_set_group(GtkRadioButton *radio_button)
复制代码

6.图像控制

复制代码
//图像控件创建函数
GtkWidget* gtk_image_new(void)
GtkWidget* gtk_image_new_file(const gchar* filename)
GtkWidget* gtk_image_new_from_pixmap(GdkPixmap *pixmap)
GtkWidget* gtk_image_new_from_pixbuf(GdkPixbuf *pixbuf)
GtkWidget* gtk_image_new_from_stock(const gchar* stock_id)
GtkWidget* gtk_image_new_from_animation(GdkPixbufAnimation *animation)

//属性设置
void gtk_image_set_from_pixmap(...)
void gtk_image_set_from_image(...)
void gtk_image_set_from_file(...)
void gtk_image_set_from_pixfuf(...)
void gtk_image_set_from_stock(...)
void gtk_image_set_from_animation(...)

//图片信息获取函数
void gtk_image_get_pixmap(...)
void gtk_image_get_image(...)
GdkPixbuf* gtk_image_get_pixbuf(...)
void gtk_image_get_icon_name(...)
GdkPixbufAnimation* gtk_image_get_animation(...)

//清空图像
void gtk_image_clear(GtkImage *image)
复制代码

例子:

View Code

7.文本框输入

复制代码
//单行输入
GtkWidget *gtk_entry_new(void)

//属性设置
void gtk_entry_set_max_length(GtkEntry* entry,gint max)
gint gtk_entry_get_max_length(GtkEntry* entry)
void gtk_entry_set_visibility(GtkEntry* entry,gboolean visible)
gboolean gtk_entry_get_visibility(GtkEntry* entry)
void gtk_editable_set_editable(GtkEditable* entry, gboolean editable)
gboolean gtk_editable_get_editable(GtkEditable* entry)
void gtk_entry_set_text(GtkEntry *entry, const gchar* text)
const gchar*  gtk_entry_get_text(GtkEntry *entry)


//多行输入
GtkWidget *gtk_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj)

//属性设置
void gtk_text_set_editable(GtkText *text, gboolean editable)
void gtk_text_set_adjustments(GtkText *text,GtkAjustment* hadj,GtkAjustment *vadj)
void gtk_text_set_word_wrap(GtkText* text,gboolean word_wrap)
guint gtk_text_get_point(GtkText *text)
void gtk_text_set_point(GtkText *text,guint index)
guint gtk_text_get_length(GtkText *text)
void gtk_text_insert(GtkText *text,GdkFont *font,GdkColor *fore,GdkColor *back,const char *chars,gint length)

//创建滚动条
vscrollbar = gtk_vscrollbar_new(GTK_TEXT(text)->vadj)
复制代码

例子:

View Code
//注意:编译时候,要添加-DGTK_ENABLE_BROKEN
gcc test.c -Wall -o test -DGTK_ENABLE_BROKEN `pkg-config --cflags --libs gtk+-2.0`

以上方法,可以解决下面的关于vscrollbar滚动条的错误:

error: invalid type argument of ‘->’ (have ‘int’)

8.对话框

复制代码
//对话框结构
struct GtkDialog{
    GtkWindow window;           //窗口
    
    GtkWidget *vbox;            //垂直组装盒
    GtkWidget *action_area;     //活动区
    GtkWidget *separator;       //分割线
};


//创建函数
GtkWidget* gtk_dialog_new(void)
GtkWidget* gtk_dialog_new_with_buttons(const gchar  *title, GtkWindow *parent,
GtkDialogFlags flags,
const gchar *first_button_text,...); //添加分割线 void gtk_dialog_set_has_separator(GtkDialog *dialog, gboolean setting) //添加按钮 GtkWidget* gtk_dialog_add_button(GtkDialog *dialog, const gchar *button_text,gint response_id); void gtk_dialog_add_buttons(GtkDialog *dialog,const gchar *first_button_text,...)
复制代码

  为了开发程序方便,GTK在GtkDialog基础上,封装了一些常用的对话框,包括消息对话框(GtkMessageDialog),应用程序信息对话框(GtkAboutDialog),文本选择对话框(GtkFileChooserDialog),字体选择对话框(GtkFontSelectionDialog)等。

例子:

View Code

 9.文本选择控件

复制代码
//创建函数
GtkWidget *gtk_file_selection_new(const gchar *title)

//属性设置
void gtk_file_selection_set_filename(GtkFileSelection *filesel,const gchar *filename);//设置默认路径,filesel文件选择控件标识,filename设置的目录和文件名

gchar* gtk_file_selection_get_filename(gtkfileselection *filesel);//获取所选文件

void gtk_file_selection_show_fileop_buttons(GtkFileSelection *filesel)//显示文件按钮

void gtk_file_selection_set_select_multiple(GtkFileSelection *filesel,gboolean select_multiple)//设置文件多选模式
复制代码

例子:

View Code

 10.菜单

  GTK中创建菜单需要三个子項,分别为:

  • 菜单項GtkMenuItem:就是用户具体要单击的对象
  • 菜单Menu:菜单項的容器,用于将创建好的菜单項添加到菜单中
  • 菜单栏GtkMenuBar:菜单的容器,用于组织各个菜单
复制代码
//创建菜单
GtkWIdget* gtk_menu_new(void)

//创建菜单项
GtkWidget* gtk_menu_item_new(void)
GtkWidget* gtk_menu_item_new_with_label(const gchar *label)
GtkWidget* gtk_menu_item_new_with_mnemonic(const gchar *label)

//创建菜单栏
GtkWidget* gtk_menu_new(void)
复制代码

  下面介绍如何将上面的菜单栏,菜单和菜单項组合成一个菜单控件。

  要将菜单項放到一个菜单中,首先需要创建一个菜单的根菜单項,即根条目,在菜单被下拉时才显示所有的菜单項。其他菜单項则组织为根菜单項的子菜单。

  可以使用追加或者插入等函数将菜单放到一个菜单中,具体函数宏定义如下:

复制代码
//将菜单項追加到菜单項列表的最后位置
#define gtk_menu_append(menu,child) gtk_menu_shell_append((GtkMenuShell *)(menu),(child))
//将菜单項添加到菜单項列表的开始位置
#define gtk_menu_prepend(menu,child) gtk_menu_shell_prepend((GtkMenuShell *)(menu),(child))
//将菜单項添加到菜单項列表的指定位置
#define gtk_menu_insert(menu,child,pos) gtk_menu_shell_insert((GtkMenuShell *)(menu),(child),(pos))


//将根菜单項与子菜单項进行关联
void gtk_menu_item_set_submenu(GtkMenuItem *menu_item,GtkWidget* submenu)


//将菜单項加到菜单栏
#define gtk_menu_bar_append(menu,child) gtk_menu_shell_append((GtkMenuShell *)(menu),(child))
#define gtk_menu_bar_prepend(menu,child) gtk_menu_shell_prepend((GtkMenuShell *)(menu),(child))
#define gtk_menu_bar_insert(menu,child,pos) gtk_menu_shell_insert((GtkMenuShell *)(menu),(child),(pos))
复制代码

总结主要步骤:

  1. 用gtk_menu_new()函数创建一个新的菜单
  2. 创建菜单上需要的菜单项,将菜单項添加到菜单上
  3. 用gtk_menu_item_new()函数创建一个根菜单項
  4. 用gtk_menu_item_set_submenu()函数将菜单绑定到根菜单項
  5. 用gtk_menu_bar_new()函数创建一个新的菜单栏
  6. 用gtk_menu_bar_append()函数将根菜单項放到菜单栏上

 例子:

View Code

11.容器与布局

组装盒:

复制代码
//创建组装盒
GtkWIght* gtk_hbox_new(gboolean homogeneous, gint spacing)//横向
GtkWIght* gtk_vbox_new(gboolean homogeneous, gint spacing)//纵向

//加入控件
void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean expand,gboolean fill,guint padding);//放在顶部或左边
void gtk_box_pack_end(GtkBox *box,GtkWidget *child,gboolean expand,gboolean fill,guint padding);//放在下部或右边
//box为组装盒,expend为可填充控件,fill是否充分利用空间,padding控件周围保留的间距

//除此之外,还有按钮盒(GtkButtonBox)
复制代码

表格:

复制代码
//创建表格
GtkWidget* gtk_table_new(guint rows, guint columns, gboolean homogeneous)

//添加控件表格的参数
void gtk_table_attach(GtkTable *table, GtkWidget *child, guint left_attach,guint right_attach,guint top_attach,guint botton_attach,GtkAttahOptions xoptions,GtkAttachOptions yoptions,guint xpadding,guint ypadding);
void gtk_table_attach_default(GtkTable *table, GtkWidget *child, guint left_attach,guint right_attach,guint top_attach,guint botton_attach);
//table表名,child控件名

//属性设置
void gtk_table_set_row_spacing(...)
guint gtk_table_get_row_spacing(...)

void gtk_table_set_col_spacing(...)
guint gtk_table_get_col_spacing(...)

guint gtk_table_get_default_row_spacing(...)
guint gtk_table_get_default_col_spacing(...)

void gtk_table_set_homogeneous(...)
gboolean gtk_table_get_homogeneous(...)
复制代码

此外,还有固定容器(GtkFixed),布局容器(GtkLayout),分割面板容器(GtkPaned),分页容器(GtkNotebook),这四种容器可以参考这里


本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/archive/2013/04/05/2999425.html,如需转载请自行联系原作者

相关文章
|
1月前
|
缓存 Linux 开发者
Linux内核中的并发控制机制
本文深入探讨了Linux操作系统中用于管理多线程和进程的并发控制的关键技术,包括原子操作、锁机制、自旋锁、互斥量以及信号量。通过详细分析这些技术的原理和应用,旨在为读者提供一个关于如何有效利用Linux内核提供的并发控制工具以优化系统性能和稳定性的综合视角。
|
3月前
|
Linux 网络安全 Python
linux centos上安装python3.11.x详细完整教程
这篇文章提供了在CentOS系统上安装Python 3.11.x版本的详细步骤,包括下载、解压、安装依赖、编译配置、解决常见错误以及版本验证。
1630 1
linux centos上安装python3.11.x详细完整教程
|
11天前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
153 17
|
19天前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
23天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
1月前
|
算法 Linux 开发者
Linux内核中的锁机制:保障并发控制的艺术####
本文深入探讨了Linux操作系统内核中实现的多种锁机制,包括自旋锁、互斥锁、读写锁等,旨在揭示这些同步原语如何高效地解决资源竞争问题,保证系统的稳定性和性能。通过分析不同锁机制的工作原理及应用场景,本文为开发者提供了在高并发环境下进行有效并发控制的实用指南。 ####
|
7天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
25 0
|
1月前
|
Linux Python
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
在 Linux 系统中,了解目录下文件数量是常见的需求。本文介绍了四种方法:使用 `ls` 和 `wc` 组合、`find` 命令、`tree` 命令以及编程实现(如 Python)。每种方法都附有详细说明和示例,适合不同水平的用户学习和使用。掌握这些技巧,可以有效提升系统管理和日常使用的效率。
438 6
|
1月前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
42 5
|
1月前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
61 6