gtk/glade程序开发(一)

转自 http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=kylix&Number=566950&page=0&view=collapsed&sb=4&o=all&fpart=all&vc=1
by cuigf
我已经安装好gtk2.0/glade2.10.0,系统环境 RH9
准备用一个月的时间 对gtk编程做一个介绍,希望大家支持。

在windows下做开发,把做成的程序转移到Linux.(源代码不做任何修改,只要重新编译、连接一次即可)

需要的开发工具:
Dev-cpp 4.9.9.2 (进行C程序的编译、连接)
Glade (进行图形界面设计)
Gtk开发组件

只需两个软件包:
devcpp-4.9.9.2_setup
gtk-win32-devel-2.6.8-rc1(包含glade和gtk开发组件)

下载网址:
www.bloodshed.net
gladewin32.sourceforge.net,

请按上面的版本下载,其它版本有bug。

下载软件并安装(先装devcpp-4.9.9.2_setup,再安装gtk-win32-devel-2.6.8-rc1,等出现dev-cpp选项时,选中它),

接下来,来运行我们的第一个程序。

(点评:作者是在windows下开发移植到Linux下的,本人不推荐这种方法)
第二节 读懂Glade生成的代码(一)

在glade的源文件目录src下有7个代码文件,它们分别是:

1> callbacks.c Glade生成的大部分空的回调函数所在的文件,你自己往里面添加代码
2> callbacks.h (头文件)Glade生成的回调函数的定义文件
4> interface.c Glade生成的界面源代码文件
5> interface.h (头文件)Glade生成的界面的定义文件
6> main.c 主函数
7> support.c 支持文件
8> support.h (头文件)支持文件

在galde生成的devcpp目录里有2个文件
1> config.h Glade 生成的配置文件
2>gtk1.dev Glade 生成的devcpp工程文件(就是你保存时启的那个名子)。

不要被这么多的文件吓着,需要你自己编写代码的文件只有三个(其它文件不要动),它们是:
main.c (一般只需做少量的修改)
callbacks.h (一般只需做少量的修改,甚至不作修改)
callbacks.c (函数的具体实现部分,你需要在这里编写一定量的代码)

其中callbacks.c是你编写代码的主文件。

下面我们来简单了解一下glade生成的界面文件interface.c

GtkWidget*
create_window1 (void)
{
GtkWidget *window1; /*定义一个窗口构件*/
GtkWidget *fixed1; /*定义一个固定容器构件,用于放置其它构件*/
GtkWidget *label1; /*定义一个标签构件*/

window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*新建一个窗口*/
gtk_window_set_title (GTK_WINDOW (window1), _("window1")); /*设置窗口的标题*/
gtk_window_set_default_size (GTK_WINDOW (window1), 400, 300); /*设置窗口的默认大小为400,300*/

fixed1 = gtk_fixed_new (); /*新建一个固定容器*/
gtk_widget_show (fixed1); /*显示固定容器*/
gtk_container_add (GTK_CONTAINER (window1), fixed1); /*添加固定容器到窗口*/

label1 = gtk_label_new (_("/346/254/242/350/277/216/350/265/260/350/277/233GTK/347/232/204/344/270/226/347/225/214")); /*新建一个标签*/
gtk_widget_show (label1); /*显示标签*/
gtk_fixed_put (GTK_FIXED (fixed1), label1, 120, 72); /*把标签添加到固定容器中*/
gtk_widget_set_size_request (label1, 136, 40); /*设置标签的大小*/

/* Store pointers to all widgets, for use by lookup_widget(). */
GLADE_HOOKUP_OBJECT_NO_REF (window1, window1, "window1");
GLADE_HOOKUP_OBJECT (window1, fixed1, "fixed1");
GLADE_HOOKUP_OBJECT (window1, label1, "label1");

return window1;
}
(点评:版本不一样,里面的代码可能有一些不同)

(这部分内容,能理解多少,理解多少,看不懂也不要紧。)
文件:main.c

只作部分解释,以后你水平高了,慢慢看吧!
以下代码节选自main.c

int main (int argc, char *argv[])
{
GtkWidget *window1; /*定义window1构件*/

gchar *pixmap_dir;
#ifdef G_OS_WIN32
package_prefix = g_win32_get_package_installation_directory (NULL, NULL);
package_data_dir = g_build_filename (package_prefix, "share", NULL);
package_locale_dir = g_build_filename (package_prefix, "share", "locale", NULL);
#endif

#ifdef ENABLE_NLS
bindtextdomain (GETTEXT_PACKAGE, package_locale_dir);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#endif

gtk_set_locale (); /*通过调用这个函数才可显示中文*/
gtk_init (&argc, &argv); /*GTK初始化*/

pixmap_dir = g_build_filename (package_data_dir, PACKAGE, "pixmaps", NULL);
add_pixmap_directory (pixmap_dir);
g_free (pixmap_dir);

/*
* The following code was added by Glade to create one of each component
* (except popup menus), just so that you see something after building
* the project. Delete any components that you don't want shown initially.
*/
window1 = create_window1 (); /*创建window1构件*/
gtk_widget_show (window1); /**显示window1构件/
g_signal_connect ((gpointer) window1, "destroy", G_CALLBACK(gtk_main_quit),
NULL);
/*为window1构件的“destroy”事件,关联函数,
也就是当单击window1的关闭按钮时,关闭window1,同时退出gtk*/
gtk_main (); /*gtk主程序开始执行*/

#ifdef G_OS_WIN32
g_free (package_prefix);
g_free (package_data_dir);
g_free (package_locale_dir);
#endif

return 0;
}

标签构件

标签构件用到的有关函数

创建新标签:
gtk_label_new(“label1”);
gtk_label_new_with_mnemonic(“label1”);
在字符串中放置换行符,可以创建多行标签。

改变标签的文本:
gtk_label_set_text(GTK_LABEL(label1),”label2”);

取得标签的当前文本:
gtk_label_get_text(GTK_LABEL(label1));

设置标签文本的对齐方式:
gtk_label_set_justify(GTK_LABEL(label1),GTK_JUSTIFY_LEFT);

GTK_JUSTIFY_LEFT /*左对齐*/
GTK_JUSTIFY_RIGHT /*右对齐*/
GTK_JUSTIFY_CENTER /*居中对齐*/
GTK_JUSTIFY_FILL /*充满*/

标签内的文本自动换行:
gtk_label_set_line_wrap(GTK_LABEL(label1),TRUE);

注:标签不能引发信号,如需引发信号,需将标签放置在事件盒中。

文本输入构件的常用函数:

创建文本输入构件:
GtkWidget *entry1;
entry1 = gtk_entry_new();

改变文本输入构件当前的文本内容:
gtk_entry_set_text(GTK_ENTRY(entry1),"entry2");

取得文本输入构件当前的文本内容:
const gchar *text1;
text1 = gtk_entry_get_text(GTK_ENTRY(entry1));

下一节,通过一个例子来说明文本输入构件(text entry)的使用。

文本输入构件 (二)

一、用glade设计界面 
    1、新建glade工程

    2、放置各种构件:新建window构件(window1),在window1上放置固定容器构件(fixed positions),在固定容器构件上放置文本输入构件(entry1)。

    3、为文本输入构件entry1添加changed信号响应(其它程序设计语言中为事件响应)on_entry1_changed,一定注意在signals选项卡中把object设置为entry1。

    4、单击Build按钮生成源代码。



二、添加代码 
    

    只需在callbacks.c中添加三行代码



    Callbacks.c

    void         on_entry1_changed        (GtkEditable     *editable,

                                         gpointer         user_data)

    {

        const gchar *text1;

        text1 = gtk_entry_get_text(GTK_ENTRY(editable));

        printf("text entry : %s/n",text1);

    }



三、运行程序 


    在编译程序之前,在devcpp中设置工程属性为“win32控制台程序”

    步骤:1、单击“工程”菜单下的“工程属性”子菜单。

              2、在“普通”选项卡中的“类型”中单击“win32控制台程序”。

              3、单击“确定”。



    编译、运行程序,在文本输入框内随变输入几个英文字母,看看运行效果。
注:在linux下,操作很简单,点击 glade 的 build 就会自动产生代码,然后运行改目录下的autogen.sh运行make ,就会在
src 目录下产生可执行的程序. 组合框构件的常用函数: 新建组合框构件: comboboxentry1 = gtk_combo_box_entry_new_text (); 给组合框构件的下拉列表添加一个新的项目: gtk_combo_box_append_text (GTK_COMBO_BOX (comboboxentry1), _("one")); 读取组合构件里的文本内容: text1 = gtk_combo_box_get_active_text(combobox); 例子: 一、用Glade设计界面 步骤:1、新建Glade工程 2、依次放置window构件(大小:400,300)、fixed positions(固定容器)构件、comboboxentry(组合框)构件。 3、在属性面板中,设置comboboxentry1的Item属性为:one (按回车)、two (按回车)、three (按回车)、 4、为comboboxentry1构件添加changed信号响应(注意:object后的文本框里填写comboboxentry1)。 5、保存项目,生成代码。 二、编写代码 编写代码以前,参照上节内容,设置工程属性为“win32控制台程序”。 callbacks.h void on_comboboxentry1_changed (GtkComboBox *combobox, gpointer user_data); callbacks.c void on_comboboxentry1_changed (GtkComboBox *combobox, gpointer user_data) { gchar *text1; text1 = gtk_combo_box_get_active_text(combobox); printf("The combo text is : %s /n",text1); } 三、运行程序,观看运行效果 开关按钮(toggle button)构件 常用函数: 创建一个新的开关按钮构件 GtkWidget *togglebutton1; togglebutton1 = gtk_toggle_button_new(); togglebutton1 = gtk_toggle_button_new_with_label(“toggle button”); togglebutton1 = gtk_toggle_button_new_with_mnemonic(“toggle button”); 读取开关按钮的状态 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) 设置开关按钮的状态 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE) 例子: 一、设计界面 步骤:1、新建Glade工程 2、依次放置window构件(大小:300,200)、fixed positions(固定容器)构件、toggle button(开关按钮)构件。 3、在属性面板中,设置togglebutton1的 label 属性为“开关按钮” 。 4、为togglebutton1构件添加clicked信号响应(注意:object后的文本框里填写togglebutton1)。 5、保存项目,生成代码。 二、编写代码 运行以前,设置工程属性为“win32控制台程序”。 callbacks.c void on_togglebutton1_clicked (GtkButton *button, gpointer user_data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) { printf("toggle button is on /n"); } else { printf("toggle button is off /n"); } } 三、运行调试 单选按钮Radio Buttons构件 单选按钮构件的常用函数: 创建单选按钮构件的代码: /*以下代码节选自interface.c*/ /*定义构件*/] GtkWidget *radiobutton1; GSList *radiobutton1_group = NULL; GtkWidget *radiobutton2; GtkWidget *radiobutton3; /* 创建构件的步骤,先定义一个radiobutton构件, 再把这个radiobutton构件添加到组(radiobutton1_group)中, 这样,所有的radiobutton构件才能关联成一个整体。*/ (注:该文写的不详细,应该是:1.创建一个radiobutton1. 2.在 radiobutton1的属性栏中的最下方有个 编组 项,选择 radiobutton1. 3.创建新的radiobutton,按照上面操作,加入 radiobutton1. ) radiobutton1 = gtk_radio_button_new_with_mnemonic (NULL, _("radiobutton1")); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton1), radiobutton1_group); radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton1)); radiobutton2 = gtk_radio_button_new_with_mnemonic (NULL, _("radiobutton2")); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton2), radiobutton1_group); radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton2)); radiobutton3 = gtk_radio_button_new_with_mnemonic (NULL, _("radiobutton3")); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton3), radiobutton1_group); radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton3)); 判断单选按钮构件状态的函数(同开关按钮): gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton1)) 一、用Glade设计界面 步骤:1、新建glade工程      2、依此放置 窗口(400,300)、固定位置、三个单选按钮构件。      3、为三个单选按钮构件,分别添加toggled信号响应,object后分别填写:radiobutton1,radiobutton2,radiobutton3。      4、保存工程,并生成代码。 二、修改代码 Interface.c g_signal_connect_swapped ((gpointer) radiobutton1, "toggled", G_CALLBACK (on_radiobutton1_toggled), GTK_OBJECT (radiobutton1)); g_signal_connect_swapped ((gpointer) radiobutton2, "toggled", G_CALLBACK (on_radiobutton2_toggled), GTK_OBJECT (radiobutton2)); g_signal_connect_swapped ((gpointer) radiobutton3, "toggled", G_CALLBACK (on_radiobutton3_toggled), GTK_OBJECT (radiobutton3)); Callbacks.h void on_radiobutton1_toggled (GtkToggleButton *radiobutton1, gpointer user_data); void on_radiobutton2_toggled (GtkToggleButton *radiobutton2, gpointer user_data); void on_radiobutton3_toggled (GtkToggleButton *radiobutton3, gpointer user_data); Callbacks.c void on_radiobutton1_toggled (GtkToggleButton *radiobutton1, gpointer user_data) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton1))) { printf("radiobutton1 is True/n"); } } void on_radiobutton2_toggled (GtkToggleButton *radiobutton2, gpointer user_data) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton2))) { printf("radiobutton2 is True/n"); } } void on_radiobutton3_toggled (GtkToggleButton *radiobutton3, gpointer user_data) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton3))) { printf("radiobutton3 is True/n"); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GTK是一种用于开发Linux GUI界面的开源工具包。它提供了许多用于创建图形用户界面的库和函数,可以用于构建各种类型的应用程序。 GTK最初是为GNU计划的一部分而创建的,它的目标是提供一个灵活、易于使用和跨平台的GUI开发工具。GTK被广泛应用于Linux发行版中,被许多知名应用程序使用,如GIMP、Inkscape等。 使用GTK开发Linux GUI应用程序有许多优点。首先,GTK是一个跨平台的工具包,可以在Linux、Windows和Mac等操作系统上运行。这使得开发人员只需编写一次代码,就可以在不同的平台上部署应用程序。 其次,GTK提供了丰富的小部件库,可以用于创建各种用户界面元素,如按钮、文本框、列表框等。开发人员可以使用这些小部件来设计出各种各样的用户界面,从简单的工具栏到复杂的应用程序界面都可以实现。 第三,GTK开发工具和文档非常丰富。GTK提供了许多开发辅助工具,如Glade界面设计器和GTKBuilder库,它们可以帮助开发人员更快、更有效地创建用户界面。此外,GTK还有详细的文档和教程,可以帮助开发人员学习和使用GTK。 最后,GTK是一个开源项目,拥有庞大的社区支持。这意味着开发人员可以轻松获取到各种资源和帮助,包括开发工具、示例代码和其他开发人员的经验分享。 总之,使用GTK开发Linux GUI应用程序是一种简单、快速和可靠的选择。它提供了丰富的功能和工具,可以帮助开发人员轻松地创建出各种各样的用户界面,并且可以在不同的操作系统上运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值