Gtk+/Glade编程(四)

布局管理

Posted by Sun Jianjiao on March 16, 2011

本文是根据只使用Gtk+的文章http://zetcode.com/tutorials/gtktutorial/gtklayoutmanagement/,将文中的例子使用Glade实现的。 当我们设计我们的GUI应用程序时,我们确定使用哪些组件,以及如何组织这些组件。我们使用不可见得“布局容器”对组件进行组织,这一章,我们会使用Glade实现GtkAlignment, GtkFixed, GtkVBox和GtkTable。

一、GtkFixed

  GtkFixed容器将子组件放在固定的位置,并且大小固定。这个容器没有自动的布局管理,在大多数的应用程序中,我们不实用GtkFixed 容器。但是有一些特殊的地方,我们使用这个容器。例如游戏,与图表协作的特殊应用程序,可移动并且可以改变大小的组件(如一个在电子表格中的图表),用于教学的小程序,由于叫布局容器,所以GtkFixed在容器中,中文叫“固定的”。 在Glade中选择组件

  1. 在”顶层”中,选择“窗口”
  2. 在”容器”中,选择“固定的”
  3. 在“控制和显示”中,选择“按钮”
  4. 可以通过工具栏中“拖拽并调整工作区部件的大小”调整组件的位置和组件的大小

编写Gtk+程序
unanao@debian:~/Experiment/gui/layout-mgt$ cat gtkfixed.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * @file gtkfixed.c
 * @brief simple use of GtkFixed container 
 * @author unanao <sunjianjiao@gmai.com>
 * @version 0.1
 * @date 2011-03-17
 */
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
 GtkWidget *window;
 GtkBuilder *builder;
 

 gtk_init(&argc, &argv);

 builder = gtk_builder_new();
 gtk_builder_add_from_file(builder, "gtkfixed.glade", NULL);

 window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));

 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 
 gtk_widget_show_all(window);

 gtk_main();

 return 0;
}

编译:

1
gcc -o gtkfixed gtkfixed.c -Wall `pkg-config --cflags --libs gtk+-2.0`

执行:

1
./gtkfixed

gtk fixed

二、GtkVBox

GtkVBox是一个盒子容器,可以将1个组件放到其中的1行里面(1个格子里)。 使用Glade设计gui

  1. 添加1个窗口
  2. 在“容器”中选择“垂直框”,设置条目数为6
  3. 向每一个长方条的框中添加按钮,别且修改,按钮的属性

编写gtk+程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * @file gtkvbox.c
 * @brief Simple example about using GtkVbox with Glade
 * @author unanao <sunjianjiao@gmai.com>
 * @version 0.1
 * @date 2011-03-19
 */
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
 GtkWidget *window;
 GtkBuilder *builder;

 gtk_init(&argc, &argv);

 builder = gtk_builder_new();
 gtk_builder_add_from_file(builder, "gtkvbox.glade", NULL);

 window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));

 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

 gtk_widget_show_all(window);

 gtk_main();

 return 0;
}

编译:

1
gcc -o gtkvbox gtkvbox.c -Wall `pkg-config --cflags --libs gtk+-2.0`

执行:

1
./gtkvbox

gtk fixed

三、GtkTable

GtkTable的是用方法与GtkVBox的方法基本一样,只是一些表各种添加组件。 设计1个计算器的gui 使用Glade设计GUI

  1. 添加窗口
  2. 在“容器”中选择“表格” -- 4*4
  3. 添加按钮,并且设置按钮的属性(标签)

编写GTK+程序:
unanao@debian:~/Experiment/gui/layout-mgt$ cat gtktable.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * @file gtktale.c
 * @brief simple example about how to use gtktable with glade
 * @Compile gcc -o gtktable gtktable.c -Wall `pkg-config --cflags --libs gtk+-2.0`
 *
 * @author unanao <sunjianjiao@gmai.com>
 * @version 0.1
 * @date 2011-03-19
 */
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkBuilder *builder;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "gtktable.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
    
    gtk_widget_show_all(window);
    
    gtk_main();

    return 0;
}

执行结果: gtk fixed

四、GtkAlignment

控制子组件的对其方式和大小

  1. 添加一个窗口:
  2. 添加一个垂直框“,条目数为1
  3. 在垂直框上加入一个”对齐“(在容器中)
  4. 这只对齐的属性: gtk fixed
  • 水平排列:1左右边,0 最左边
  • 垂直排列:1最下边,0最上边
  • 缩放比例:是否随着窗口的变化而变化,0为不变化。
  1. 添加“水平框”(在容器中),并且设置属性 gtk fixed

间距设置两个框之间的间距。

  1. 向“水平框”中添加两个按钮--标签为ok 和 close

Gtk+程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * @file gtkalignment.c
 * @brief simple use of GtkAlignment container 
 * @author unanao <sunjianjiao@gmai.com>
 * @version 0.1
 * @date 2011-03-17
 */
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkBuilder *builder;
    

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "gtkalignment.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);    
    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

执行结果:
gtk fixed