2013-02-27 1 views
3

Я решил создать игрушечное приложение, в котором я изменяю размер таблицы меток, добавляя строки/столбцы элементов в GtkGrid.GtkGrid не показывает новые виджеты, прикрепленные к нему

При добавлении нового элемента в GtkGrid изнутри функции обратного вызова кнопки виджет сетки обновляет свой размер, но не обновляет содержимое.

#include <gtk/gtk.h> 

static void kaboom(GtkWidget*, gpointer); 
static void minusVert(GtkWidget*, gpointer); 
static void plusVert(GtkWidget*, gpointer); 

static int x = 1; 
static int y = 1; 

int main(int argc, char** argv) { 
    GtkWidget* window, *subs, *buts, *grid, *button; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window), "Playground!!"); 
    gtk_widget_set_size_request(window, 200, 50); 

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(kaboom), NULL); 

    subs = gtk_paned_new(GTK_ORIENTATION_VERTICAL); 
    gtk_container_add(GTK_CONTAINER(window), subs); 

    grid = gtk_grid_new(); 
    gtk_paned_pack1(GTK_PANED(subs), grid, true, false); 

    gtk_grid_set_row_homogeneous(GTK_GRID(grid), true); 
    gtk_grid_set_column_homogeneous(GTK_GRID(grid), true); 

    gtk_grid_attach(GTK_GRID(grid), gtk_label_new("×"), 0, 0, 1, 1); 

    buts = gtk_grid_new(); 
    gtk_paned_pack2(GTK_PANED(subs), buts, false, false); 

    gtk_grid_set_row_homogeneous(GTK_GRID(grid), true); 
    gtk_grid_set_column_homogeneous(GTK_GRID(buts), true); 

    gtk_grid_attach(GTK_GRID(buts), gtk_label_new("Vertical"), 0, 0, 2, 1); 

    button = gtk_button_new_with_label("-"); 
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(minusVert), grid); 
    gtk_grid_attach(GTK_GRID(buts), button, 0, 1, 1, 1); 

    button = gtk_button_new_with_label("+"); 
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(plusVert), grid); 
    gtk_grid_attach(GTK_GRID(buts), button, 1, 1, 1, 1); 

    gtk_grid_attach(GTK_GRID(buts), gtk_label_new("Horizontal"), 2, 0, 2, 1); 

    button = gtk_button_new_with_label("-"); 
    gtk_grid_attach(GTK_GRID(buts), button, 2, 1, 1, 1); 

    button = gtk_button_new_with_label("+"); 
    gtk_grid_attach(GTK_GRID(buts), button, 3, 1, 1, 1); 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

static void kaboom(GtkWidget* window, gpointer data) { 
    gtk_main_quit(); 
} 

static void minusVert(GtkWidget *button, gpointer data) { 
    if (y > 1) { 
     // Remove all the elems in the last row 
     for (int i = 0; i < x; ++i) { 
      gtk_widget_destroy(gtk_grid_get_child_at(GTK_GRID(data), i, y - 1)); 
     } 
     --y; 
    } 
} 

static void plusVert(GtkWidget *button, gpointer data) { 
    for (int i = 0; i < x; ++i) { 
     // Add the new row 
     gtk_grid_attach(GTK_GRID(data), gtk_label_new("×"), i, y, 1, 1); 
    } 
    ++y; 
} 

скриншоты до и после:

The screenshots before and after

Мой вопрос: как я могу сделать новые этикетки, прикрепленные к GtkGrid видимым?

Примечания: Я использую C++, но не GTKmm, потому что я работаю над книгой, написанной для GTK +. Даже если портировать на чистый C, приложение ведет себя одинаково.

+0

В чем вопрос/проблема? Что вы пробовали и какие результаты у вас были до сих пор? –

+0

@SimonMartin Похоже, мой оригинальный пост был действительно неуклюже собран. Сожалею. –

ответ

3

При создании виджетов они по умолчанию не отображаются. Вы должны сказать им сделать это. Вы можете изменить функцию обратного вызова plusVert что-то вроде:

static void plusVert(GtkWidget *button, gpointer data) { 
    for (int i = 0; i < x; ++i) { 
    GtkWidget *label = gtk_label_new("×"); 
    gtk_grid_attach(GTK_GRID(data), label, i, y, 1, 1); 
    gtk_widget_show(label); 
    } 
    ++y; 
} 

См gtk_widget_show().

+0

Спасибо, что ответили на мой вопрос и сделали оригинальное представление яснее. –