GTK 布局管理

2021-09-02 11:22:50 字數 4439 閱讀 4736

這一小結,將要學習將構建布局在視窗和對話方塊中.為了方便的管理我們的構件,在gtk+中,通常使用不可見的構件稱作layout containers.

這一小節將要討論gtkalignment,gtkfixed,gtkvbox,gtktable.

(一):gtkfixed

容器構建gtkfixed用於布置子構件在乙個固定的位置和設定固定的大小.這種構件並不屬於自動的布局關係器.實質上,在大多數應用程式中,並不多使用gtkfixed;

而在只用於一些比較特殊的場合,例如:遊戲,含有繪圖功能的專用軟體,那些需要移動和調整大小的軟體(如電子**中的圖示)以及那些小型的教育用途軟體.

下面我們看乙個例子:

#include 

int main(int argc,char *argv)

下面是執行的結果:

在上面的例子中,我們使用**生成了三個按鈕,這三個按鈕布局在固定的位置上.當視窗的大小改變的時候,按鈕將會固定保持他們的大小和固定的座標.

使用函式gtk_fixed_new()就能夠生成乙個gtkfixed的容器構件.如果我們想要想容器中新增元件,使用函式:

gtk_fixed_put(),例如gtk_fixed_put(gtk_fixed(fixed),button1,150,50);

button1的座標為x=150,y=50

(二):gtkvbox

gtkvbox是一種用於垂直布局的容器構件,他把放置在他中的子構件放置在乙個單獨的列中.類似的是 gtkhbox是放在乙個單獨的行中,是一種水平布局.

下面我們看乙個例子:

#include 

int main(int argc,char *argv)

下面是程式的執行結果:

效果很明顯,垂直排版,所以我們在排版選單選項的時候,就是使用這個工具的.

在上面這個例子中,如果改變視窗大小的時候,按鈕的大小也會發生改變的.

使用函式gtk_vbox_new()可以生成gtkbox構件.在本例子中:

vbox = gtk_vbox_new(true,1);

第乙個引數設定為true,表示所有的按鈕大小都是一樣的,並且按鈕之間的距離設定為」1」畫素.

至於下面這個函式

gtk_box_pack_start(gtk_box(vbox),settings,true,true,0);

該函式將」settings」構件布局在vbox 容器中.其中該函式的前兩個引數分別是存放構件的容器和搜要放置的構件.後面的三個引數分別是expand,fill和padding,如果fill對應的引數如果設定為false的話,按鈕就不會充滿整個vbox構件.如果之前在gtk_vbox_new(true,1);中已經設定按鈕都是等寬高的話,expand對應的引數是完全沒有效果的.(在這裡盡量這兩個引數都設定成true).

(三):gtktable容器

gtktabel容器,顧名思義,該容器類似於乙個**,既可以按照行來布局,也可以按照列來布局.

下面是我們的乙個例子.

#include int main(int argc,char *argv)

; gtk_init(&argc,&argv);

window = gtk_window_new(gtk_window_toplevel);

gtk_window_set_position(gtk_window(window),gtk_win_pos_center);

gtk_window_set_default_size(gtk_window(window),250,180);

gtk_window_set_title(gtk_window(window),"gtktable");

gtk_container_set_border_width(gtk_container(window),5);

table = gtk_table_new(4,4,true);

gtk_table_set_row_spacings(gtk_table(table),2);

gtk_table_set_col_spacings(gtk_table(table),2);

int i = 0;

int j = 0;

int pos = 0;

for(i = 0;i < 4;i++)

}gtk_container_add(gtk_container(window),table);

gtk_widget_show_all(window);

gtk_main();

return

0;}

下面是執行之後的效果:

通過上面執行的效果,我們看到我們做的是乙個計算機的布局.

table = gtk_table_new(4,4,true);

這樣就生成了乙個gtktabel布局構件,並設定為4行4列.

gtk_table_set_row_spacings(gtk_table(table),2);

gtk_table_set_col_spacings(gtk_table(table),2);

這兩個函式的目的是設定每行與每列的距離.

for(i = 0;i < 4;i++)

}

該**將會生成16個按鈕並把他們布局 在gtktable容器構件中.

(四):gtkalignment

gtkalignment容器構件控制了她的子構件的對齊方式和大小.

下面我們看乙個例子.

#include 

int main(int argc,char *argv)

下面是程式執行的結果:

在這個例子中,將兩個按鈕布局到乙個視窗的右下角.為了實現這個效果,我們使用了乙個水平盒子構建horizontal box,乙個豎直盒子構建vertical box和兩個對齊容器構件alignment containers.

valign =gtk_alignment_new(0,1,0,0);
這樣生成乙個對齊容器構件.

gtk_conatiner_add(gtk_container(vbox),valign);
將對齊容器構件布局在水平盒子中.

hbox = gtk_hbox_new(true,3);    

ok = gtk_button_new_with_label("ok");

gtk_widget_set_size_request(ok,70,30);

gtk_container_add(gtk_container(hbox),ok);

close = gtk_button_new_with_label("close");

gtk_container_add(gtk_container(hbox),close);

上面**首先生成乙個水平盒子,並將兩個按鈕布局在裡面.

halign = gtk_alignment_new(1,0,0,0);

gtk_container_add(gtk_container(halign),hbox);

gtk_box_pack_start(gtk_box(vbox),halign,false,false,0);

上述**生成乙個對齊容器構件,然後將其子控制項布局在右邊,我們把水平盒子新增到對齊容器構件中,然後又把對齊容器構件新增到豎直盒子中.

注意:對齊容器構建只能放置乙個子構件.所以要用盒子構件來幫助布局.

(五)​:windows

該構件是乙個比較常用的構建,我們先看一下在**中如何使用,再看一下執行之後的結果:

#include 

int main(int argc,char *argv)

下面是執行之後的結果:

在下面的乙個小節當中,我們將要了解gtk+圖形開發中至關重要的乙個問題,就是通過signal來實現事件的監聽,同時了解一下訊號機制的內部原理。

GTK 布局管理

gtk 中用於管理各種構件布局的是一類特殊的構件,稱作布局容器 layout containers 這類構件不可見,並且有很多種,常用的有以下幾種 gtkhbox 水平組裝盒 gtkvbox 垂直組裝盒 gtktable 表組裝 gtkalignment 可以控制子構件的對其方式和大小 gtkhbo...

GTK 學習筆記2 布局管理

gtk 中用於管理各種構件布局的是一類特殊的構件,稱作布局容器 layout containers 這類構件不可見,並且有很多種,常用的有以下幾種 gtkhbox 水平組裝盒 gtkvbox 垂直組裝盒 gtktable 表組裝 gtkalignment 可以控制子構件的對其方式和大小 gtkhbo...

GTK 學習筆記2 布局管理

gtk 中用於管理各種構件布局的是一類特殊的構件,稱作布局容器 layout containers 這類構件不可見,並且有很多種,常用的有以下幾種 gtkhbox 水平組裝盒 gtkvbox 垂直組裝盒 gtktable 表組裝 gtkalignment 可以控制子構件的對其方式和大小 gtkhbo...