2011-11-22 130 views
1

我有一個可能很難描述的簡單問題。GTK +:佈局對齊問題

我的GTK +窗口是這樣的:

想象一下,它有3個組件:按鈕的2個工具欄和一個繪圖區域。

在左邊,我有一個垂直的按鈕工具欄,右邊是繪圖區(很大),下面有一個水平的按鈕工具欄。

我想讓左側垂直工具欄完全位於繪圖區域的中間,但水平線位於繪圖區域下方,但第一個按鈕應該從繪圖區域開始的位置開始。

我能夠得到一個(我的任何條件),但不是兩個!

我能否按我想要的方式對齊組件?

我正在爲垂直工具欄創建一個放置按鈕的vbox。我有另一個垂直組件與繪圖區域和水平工具欄(這是它自己的hbox)。之後,我創建一箇中心對齊,並在其中放置垂直的按鈕工具欄。最後,我把這兩個元素重新放在一個盒子裏。

結果是,水平欄在繪圖區域的正下方,但左側的垂直欄位於繪圖區域和水平欄的中心(而不僅僅是水平區域)。

我把下面的代碼,但希望它不是太難看:

GtkWidget *infoBox = gtk_vbox_new(FALSE, 10); 
    GtkWidget *drawingArea = gtk_drawing_area_new(); 

    GtkWidget *toolBar = gtk_vbox_new(FALSE, 10); 
    /* Put the buttons (vertical bar on the left) */ 

    GtkWidget *deviceButtons = gtk_hbox_new(FALSE, 5); 
    /* Put the buttons (horizontal bar below the drawing area) */ 

    GtkWidget *verticalView = gtk_vbox_new(FALSE, 10); 

    GtkWidget *centerAlignment = gtk_alignment_new(0, 0.5, 0, 0); 
    gtk_container_add(GTK_CONTAINER(centerAlignment), toolBar); 

    GtkWidget *actionView = gtk_hbox_new(FALSE, 15); 
    gtk_box_pack_start(GTK_BOX(actionView), centerAlignment, FALSE, FALSE, 0); 
    gtk_box_pack_start(GTK_BOX(verticalView), drawingArea, FALSE, FALSE, 0); 
    gtk_box_pack_start(GTK_BOX(verticalView), deviceButtons, FALSE, FALSE, 0); 
    gtk_box_pack_start(GTK_BOX(actionView), verticalView, FALSE, FALSE, 0); 
    GtkWidget *deviceView = gtk_vbox_new(FALSE, 10); 
    gtk_box_pack_start(GTK_BOX(deviceView), actionView, FALSE, FALSE, 0); 

    gtk_box_pack_start(GTK_BOX(infoBox), deviceView, FALSE, FALSE, 0); 

    gtk_container_add(GTK_CONTAINER(deviceWindow), infoBox); 

我真的很想知道,如果我的問題是可以解決的。我想我是根據一個元素(繪圖區域)的位置來定義兩個容器(或元素,按鈕條)的位置,我不知道這是否可能。

非常感謝。

回答

2

正如Johannes所說,你應該爲此使用一個GtkTable。問題在於,左下角的空間在計算大小時總會被考慮進去,而在HBox或VBox中。所以你的工具欄都不應該放在那裏擴展的容器中。

看到這張照片: Widgets placement

紅色區域不能被分配到任何您的工具欄,否則也不會被對準您想要的方式。我認爲在這裏對準不會有幫助。所以我看到的唯一解決方案是使用GtkTable。而且,在GTK3中,GtkHBox和GtkVBox已被棄用,以及GtkTable,並由GtkGrid取代,後者的工作方式與GtkTable差不多。

+0

非常感謝! – Jary

2

您可以使用2x2 GtkTable並將左下方的單元格留空。