2014-01-15 48 views
2

在Windows 7中的gtk + 3.0中。在hbox中停止按鈕以垂直擴展

我正在創建一個按鈕並將它們打包到水平框中。我已將展開設置爲FALSE。現在該按鈕不是沿x方向擴展,而是垂直擴展。我不希望按鈕也垂直擴展。

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

    GtkWidget* window = NULL; 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window), "Layout using BOX"); 
    //gtk_widget_set_size_request(window, 50, 300); 
    gtk_container_set_border_width(GTK_CONTAINER(window), 10); 
    g_signal_connect(window, "delete_event", G_CALLBACK(gtk_main_quit), NULL); 

    GtkWidget* button[5] = {NULL}; 
    for(int i = 0; i < 5; ++i) { 
     std::stringstream buton_label; 
     buton_label << "Button "; 
     buton_label << (i + 1); 
     button[i] = gtk_button_new_with_label(buton_label.str().c_str()); 
     gtk_widget_set_hexpand(button[i], FALSE); 

     g_signal_connect(button[i], "clicked", G_CALLBACK(button_clicked_cb), (gpointer)window); 
    } 

    GtkWidget *hbox = NULL; 
    hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); 
    //hbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); 

    for(int i = 0; i < 5; ++i) { 
     gtk_box_pack_start(GTK_BOX(hbox), button[i], FALSE, TRUE, 10); 
    } 

    gtk_container_add(GTK_CONTAINER(window), hbox); 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

回答

0

在GTK 3中,小部件告訴容器如何擴展它(在GTK 2中是相反的)。因此,您需要使用您的小部件的hexpandvexpand屬性進行水平和垂直擴展,其功能類似於gtk_widget_set_hexpand。與halignvalign一致。

編輯

作爲一個例外,讀的gtk_box_pack_start文檔及其fill參數:

填寫

TRUE,如果空間在給孩子擴展選項實際上是 分配給孩子,而不是隻填充它。如果expand設置爲FALSE,則此參數具有 無效。 小孩總是分配一個水平GtkBox的全高和一個垂直的全寬 GtkBox。該選項會影響其他維度。

所以,如果你想控制的其他維度,把水平盒子垂直框,你會打電話gtk_box_pack_start時設置expandFALSE內。

#include <gtk/gtk.h> 
#include <sstream> 

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

    GtkWidget* window = NULL; 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window), "Layout using BOX"); 
    //gtk_widget_set_size_request(window, 50, 300); 
    gtk_container_set_border_width(GTK_CONTAINER(window), 10); 
    g_signal_connect(window, "delete_event", G_CALLBACK(gtk_main_quit), NULL); 

    GtkWidget* button[5] = {NULL}; 
    for(int i = 0; i < 5; ++i) { 
     std::stringstream buton_label; 
     buton_label << "Button "; 
     buton_label << (i + 1); 
     button[i] = gtk_button_new_with_label(buton_label.str().c_str()); 
     gtk_widget_set_hexpand(button[i], FALSE); 

//  g_signal_connect(button[i], "clicked", G_CALLBACK(button_clicked_cb), (gpointer)window); 
    } 

    GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); 
    GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); 

    for(int i = 0; i < 5; ++i) { 
     gtk_box_pack_start(GTK_BOX(hbox), button[i], FALSE, FALSE, 10); 
    } 

    gtk_container_add(GTK_CONTAINER(vbox), hbox); 
    gtk_container_add(GTK_CONTAINER(window), vbox); 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

使用箱(這可能是有點很難使用,因爲你必須弄清楚事情是如何擴大)的這一翻譯,請嘗試使用更強大的GtkGrid。它可以像我上面所說的那樣與chidren的hexpand/vexpand屬性一起工作。

+0

按鈕垂直擴展,甚至添加gtk_widget_set_hexpand(button [i],FALSE); – dearvivekkumar

+1

'hexpand'是**水平**展開。對於垂直展開,請使用'vexpand'。 – liberforce

+1

同樣的結果,仍然按鈕正在垂直擴展 – dearvivekkumar