注册 登录
编程论坛 Linux教室

GTK+实例学习(笔记)

guixiaolan 发布于 2008-09-18 11:58, 5505 次点击
第1个例子:建立窗体

程序代码:
#include<gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;//定义

 gtk_init(&argc,&argv);//初始化

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口

 gtk_widget_show(window);//显示窗口

 gtk_main();

 return 0;
}

/*

 * GNOME既是一个桌面,也是一个完整的程序设计环境

 * GIMP是UNIX操作系统上的影像处理程序

 * GTK+是GIMP工具包,能支持许多程序设计语言

 * GTK+使用GLIB库和GDK库

 * GLIB定义了数据类型,提供了错误处理和内存管理方面的函数

 * GDK是本地图形化API和GTK+中间的一个过渡层,需要依赖具体的计算机平台,移植GTK+重新编写GDK

 * GTK+的安装就不多述,命令pkg-config --modversion gkt+-2.0检验GTK+2.0

 * 命令gcc 000.c -o 000 `pkg-config --cflags --libs gtk+-2.0`编译程序

 * 执行000即可查看结果,命令./000

 * 如果在命令行中打开,在关闭时并没有退出,要通过CTRL+C来关闭

 */
20 回复
#2
guixiaolan2008-09-18 22:07
控制台输出信息
第2个例子:控制台输出信息
程序代码:
#include<gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_widget_show(window);

 g_print("hello world");//在控制台打印信息,通常测试用

 g_warning("hello world");//在控制台输出警告信息

 g_message("hello world");//输出信息

 gtk_main();

 return 0;
}


[[it] 本帖最后由 guixiaolan 于 2008-9-18 22:09 编辑 [/it]]
#3
guixiaolan2008-09-18 22:09
每隔5秒在控制台打印信息
程序代码:
#include<gtk/gtk.h>

gint n=1;//glib数据类型同C语言基本类型,只是在前面加一个g
gint function(gpointer data);

int main(int argc,char *argv[])
{

 GtkWidget *window;

 gpointer data;

 gint sign;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_widget_show(window);

 sign=g_timeout_add(500,function,data);//每隔5秒打印信息

 gtk_main();

 return 0;
}

gint function(gpointer data)
{

 g_print("hello\n");

 

 if(++n>5)
  return 0;
}
#4
guixiaolan2008-09-18 22:10
关闭窗体时也从控制台退出
程序代码:
#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(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

 //关闭时自动退出

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#5
guixiaolan2008-09-18 22:12
窗体属性
程序代码:
#include<gtk/gtk.h>

void destroy(GtkWidget *widget,gpointer data)
{

 g_print("quit successful!\n");

 gtk_main_quit();
}

int main(int argc,char *argv[])
{

 GtkWidget *window;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(destroy),NULL);//关闭窗口时调用函数

 gtk_window_set_title(GTK_WINDOW(window),"Main Window"); //设置窗体标题

 gtk_window_set_resizable(GTK_WINDOW(window),FALSE); //设置窗体是否可改变大小

 gtk_widget_set_size_request(window,200,200); //设置窗体初始大小

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#6
guixiaolan2008-09-18 22:13
敏感按钮
程序代码:
#include<gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

 button=gtk_button_new_with_label("button");

 gtk_container_add(GTK_CONTAINER(window),button);

 gtk_container_set_border_width(GTK_CONTAINER(window),20);//窗口边框宽度

 gtk_widget_set_sensitive(button,FALSE); //按钮是否敏感,FALSE表示不敏感,则无法单击心以及调用函数

 gtk_widget_show(button);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#7
guixiaolan2008-09-18 22:14
按钮布置
程序代码:
#include<gtk/gtk.h>

void PackNewButton(GtkWidget *box,char *szLabel);

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *box;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

 //box=gtk_vbox_new(FALSE,0);

 box=gtk_hbox_new(FALSE,0);

 

 /* FALSE表示每个构件大小不相同,即每个构件刚好为容纳标号的大小
  * 0是每个构件间隔距离
  */

 

 //PackNewButton(box,"button1");

 PackNewButton(box,"but1");

 PackNewButton(box,"button2");

 PackNewButton(box,"button3");

 PackNewButton(box,"button4");

 PackNewButton(box,"button5");


 gtk_container_add(GTK_CONTAINER(window),box);

 gtk_widget_show(box);

 gtk_widget_show(window);

 gtk_main();
}

void PackNewButton(GtkWidget *box,char *szLabel)
{

 GtkWidget *button;

 button=gtk_button_new_with_label(szLabel);

 gtk_box_pack_start(GTK_BOX(box),button,FALSE,TRUE,5);

 //第一个FALSE表示变化窗口大小时,子构件大小不变

 gtk_widget_show(button);
}
#8
guixiaolan2008-09-18 22:15
按钮布置2
程序代码:
#include<gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *table;

 GtkWidget *button;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

 table=gtk_table_new(2,2,FALSE);//表的行,表的列,子构件是否具有同样的大小


 button=gtk_button_new_with_label("button1");

 gtk_table_attach(GTK_TABLE(table),button,0,1,0,1,GTK_FILL,GTK_FILL,0,0);

 gtk_widget_show(button);


 button=gtk_button_new_with_label("button2");

 gtk_table_attach(GTK_TABLE(table),button,1,2,1,2,GTK_FILL,GTK_FILL,0,0);

 gtk_widget_show(button);


 gtk_container_add(GTK_CONTAINER(window),table);

 gtk_widget_show(table);

 gtk_widget_show(window);

 gtk_main();

 return FALSE;
}
#9
guixiaolan2008-09-18 22:16
固定容器构件
程序代码:
#include <gtk/gtk.h>

GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button;
gint function(gpointer data);
gpointer data;
gint sign;
int x=50;
int y=50;

int main(int argc,char *argv[])
{

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

 fixed=gtk_fixed_new();//创建固定容器构件

 button=gtk_button_new_with_label("button");

 gtk_fixed_put(GTK_FIXED(fixed),button,50,50);//将按钮加入到固定容器构件中,并将固定容器放入到指定位置处

 sign=g_timeout_add(600,function,data);

 gtk_container_add(GTK_CONTAINER(window),fixed);

 gtk_widget_show(fixed);

 gtk_widget_show(button);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}

gint function(gpointer data)
{

 gtk_fixed_move(GTK_FIXED(fixed),button,++x,++y);//移动

 return TRUE;
}
#10
guixiaolan2008-09-18 22:17
按钮事件
程序代码:
#include <gtk/gtk.h>

void button_event(GtkWidget *,gpointer *);

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);


 button=gtk_button_new_with_label("Button");

 gtk_signal_connect(GTK_OBJECT(button),"pressed",GTK_SIGNAL_FUNC(button_event),"pressed the button");

 gtk_signal_connect(GTK_OBJECT(button),"released",GTK_SIGNAL_FUNC(button_event),"released the button");

 gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(button_event),"clicked the button");

 gtk_signal_connect(GTK_OBJECT(button),"enter",GTK_SIGNAL_FUNC(button_event),"enter the button");

 gtk_signal_connect(GTK_OBJECT(button),"leave",GTK_SIGNAL_FUNC(button_event),"leave the button");

 //上面5个事件分别是“按下” "释放" "点击" "进入" "离开" 按钮

 gtk_container_add(GTK_CONTAINER(window),button);

 gtk_widget_show(button);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}

void button_event(GtkWidget *widget,gpointer *data)
{

 g_print("Button event:%s\n",data);
}
#11
guixiaolan2008-09-20 21:36
触发按钮
程序代码:
#include <gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);


 button=gtk_toggle_button_new_with_label("Button");//触发按钮

 gtk_container_add(GTK_CONTAINER(window),button);

 gtk_widget_show(button);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#12
guixiaolan2008-09-20 21:37
触发按钮,带复选框
程序代码:
#include <gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);


 button=gtk_check_button_new_with_label("Button");//触发按钮,带复选框

 gtk_container_add(GTK_CONTAINER(window),button);

 gtk_widget_show(button);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#13
guixiaolan2008-09-20 21:38
带标签的按钮
程序代码:
#include <gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 GtkWidget *box;

 GSList *group=NULL;//组,初始设为NULL


 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);

 box=gtk_vbox_new(FALSE,0);


 button=gtk_radio_button_new(group);//创建一个不带标签的选择按钮

 group=gtk_radio_button_group(GTK_RADIO_BUTTON(button));//将按钮放入到组中

 gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);//将按钮加入到组合框中

 gtk_widget_show(button);


 button=gtk_radio_button_new_with_label(group,"Radio Button2");//创建一个带标签的按钮

 group=gtk_radio_button_group(GTK_RADIO_BUTTON(button));

 gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);

 gtk_widget_show(button);


 gtk_container_add(GTK_CONTAINER(window),box);

 gtk_widget_show(box);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#14
guixiaolan2008-09-20 21:38
标签构件
程序代码:
#include <gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *label;

 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);

 label=gtk_label_new("This is a label");//创建标签构件

 gtk_widget_show(label);


 gtk_container_add(GTK_CONTAINER(window),label);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#15
guixiaolan2008-09-20 21:38
程序代码:
#include <gtk/gtk.h>

void button_event(GtkWidget *,gpointer *);
GtkWidget *label;

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 GtkWidget *box;

 GSList *group=NULL;


 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);

 box=gtk_vbox_new(FALSE,0);

 label=gtk_label_new("Please check!");

 gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,30);


 button=gtk_radio_button_new_with_label(group,"Radio Button1");

 group=gtk_radio_button_group(GTK_RADIO_BUTTON(button));

 gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);

 gtk_signal_connect(GTK_OBJECT(button),"pressed",GTK_SIGNAL_FUNC(button_event),"You check button1");

 //单击按钮时标签标号发生变化

 gtk_widget_show(button);


 button=gtk_radio_button_new_with_label(group,"Radio Button2");

 group=gtk_radio_button_group(GTK_RADIO_BUTTON(button));

 gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);

 gtk_signal_connect(GTK_OBJECT(button),"pressed",GTK_SIGNAL_FUNC(button_event),"You check button2");

 gtk_widget_show(button);


 gtk_container_add(GTK_CONTAINER(window),box);

 gtk_widget_show(label);

 gtk_widget_show(box);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}

void button_event(GtkWidget *widget,gpointer *data)
{

 gtk_label_set(GTK_LABEL(label),(char *)data);
}
#16
guixiaolan2008-09-20 21:39
程序代码:
#include <gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *label;


 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_widget_set_usize(window,200,200);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);


 label=gtk_label_new("This is a label");

 gtk_widget_set_usize(label,100,10);//标签大小


 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER);//设置文本对齐方式

 gtk_label_set_line_wrap(GTK_LABEL(label),TRUE);//文本可自动换行

 gtk_widget_show(label);


 gtk_container_add(GTK_CONTAINER(window),label);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#17
guixiaolan2008-09-20 21:39
程序代码:
#include <gtk/gtk.h>

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *event_box;

 GtkWidget *label;


 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

 gtk_container_set_border_width(GTK_CONTAINER(window),10);


 event_box=gtk_event_box_new();//事件盒构件

 gtk_container_add(GTK_CONTAINER(window),event_box);

 gtk_widget_show(event_box);


 label=gtk_label_new("Click here to quit");

 gtk_container_add(GTK_CONTAINER(event_box),label);

 gtk_widget_show(label);

 gtk_signal_connect(GTK_OBJECT(event_box),"button_press_event",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

 //单击标签时发生事件

 gtk_widget_show(window);

 gtk_main();

 return 0;
}
#18
guixiaolan2008-09-20 21:40
程序代码:
#include <gtk/gtk.h>

void button_event(GtkWidget *,gpointer *);
GtkWidget *name;

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 GtkWidget *box;

 GtkWidget *label;


 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);


 box=gtk_vbox_new(FALSE,0);

 label=gtk_label_new("Name");

 gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,5);

 gtk_widget_show(label);


 name=gtk_entry_new();//录入构件

 gtk_box_pack_start(GTK_BOX(box),name,FALSE,FALSE,5);

 gtk_entry_prepend_text(GTK_ENTRY(name),"Please input your name!");//初始化录入构件框

 gtk_widget_show(name);

 

 button=gtk_button_new_with_label("enter");

 gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,5);

 gtk_signal_connect(GTK_OBJECT(button),"pressed",GTK_SIGNAL_FUNC(button_event),"enter");

 gtk_widget_show(button);


 gtk_container_add(GTK_CONTAINER(window),box);

 gtk_widget_show(box);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}

void button_event(GtkWidget *widget,gpointer *data)
{

 const gchar *uname;

 uname=gtk_entry_get_text(GTK_ENTRY(name));//取得录入的内容并打印

 g_print("Name:%s\n",uname);
}
#19
guixiaolan2008-09-20 21:40
程序代码:
#include <gtk/gtk.h>

void button_event(GtkWidget *,gpointer *);
GtkWidget *name;
GtkWidget *passwd;

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *button;

 GtkWidget *box;

 GtkWidget *label;


 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);


 box=gtk_vbox_new(FALSE,0);

 label=gtk_label_new("name");

 gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,5);

 gtk_widget_show(label);

 

 name=gtk_entry_new();

 gtk_box_pack_start(GTK_BOX(box),name,FALSE,FALSE,5);

 gtk_widget_show(name);


 label=gtk_label_new("passwd");

 gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,5);

 gtk_widget_show(label);


 passwd=gtk_entry_new();

 gtk_entry_set_visibility(GTK_ENTRY(passwd),FALSE);//录入内容不可见,如密码等

 gtk_box_pack_start(GTK_BOX(box),passwd,FALSE,FALSE,5);

 gtk_widget_show(passwd);


 button=gtk_button_new_with_label("enter");

 gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,5);

 gtk_signal_connect(GTK_OBJECT(button),"pressed",GTK_SIGNAL_FUNC(button_event),"enter");

 gtk_widget_show(button);


 gtk_container_add(GTK_CONTAINER(window),box);

 gtk_widget_show(box);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}

void button_event(GtkWidget *widget,gpointer *data)
{

 const gchar *uname;

 const gchar *upasswd;

 uname=gtk_entry_get_text(GTK_ENTRY(name));

 upasswd=gtk_entry_get_text(GTK_ENTRY(passwd));

 g_print("Name:%s\n",uname);

 g_print("Passwd:%s\n",upasswd);
}
#20
guixiaolan2008-09-20 21:41
程序代码:
#include <gtk/gtk.h>

GtkWidget *CreateMenuItem(GtkWidget *MenuBar,char *test);
GtkWidget *CreateMenu(GtkWidget *MenuItem);

int main(int argc,char *argv[])
{

 GtkWidget *window;

 GtkWidget *MenuBar;

 GtkWidget *box;

 GtkWidget *MenuItemFile;


 gtk_init(&argc,&argv);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_widget_set_usize(window,400,200);

 gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);


 box=gtk_vbox_new(FALSE,0);

 gtk_container_add(GTK_CONTAINER(window),box);

 MenuBar=gtk_menu_bar_new();//创建菜单条

 gtk_box_pack_start(GTK_BOX(box),MenuBar,FALSE,TRUE,0);

 


 MenuItemFile=CreateMenuItem(MenuBar,"File");//创建菜单项

 CreateMenu(MenuItemFile);//创建子菜单

 CreateMenuItem(MenuBar,"Edit");

 CreateMenuItem(MenuBar,"View");

 CreateMenuItem(MenuBar,"Insert");

 CreateMenuItem(MenuBar,"Tool");


 gtk_widget_show(box);

 gtk_widget_show(MenuBar);

 gtk_widget_show(window);

 gtk_main();

 return 0;
}

GtkWidget *CreateMenuItem(GtkWidget *MenuBar,char *test)
{

 GtkWidget *MenuItem;

 MenuItem=gtk_menu_item_new_with_label(test);//创建菜单项

 gtk_menu_shell_append(GTK_MENU_SHELL(MenuBar),MenuItem);//将菜单项放入到菜单条中

 gtk_widget_show(MenuItem);

 return MenuItem;
}

GtkWidget *CreateMenu(GtkWidget *MenuItem)
{

 GtkWidget *Menu;

 GtkWidget *Exit;

 Menu=gtk_menu_new();//创建子菜单

 CreateMenuItem(Menu,"New");//创建子菜单项

 CreateMenuItem(Menu,"Open");

 CreateMenuItem(Menu,"Save");

 Exit=CreateMenuItem(Menu,"Exit");//退出

 g_signal_connect(GTK_OBJECT(Exit),"activate",G_CALLBACK(gtk_main_quit),NULL);

 gtk_menu_item_set_submenu(GTK_MENU_ITEM(MenuItem),Menu);//将子菜单放入到父菜单中

 gtk_widget_show(Menu);

 return Menu;
}
#21
cjjc2008-09-20 21:50
demo source code 里面有很多 ?
1