Дублировать GtkWidget на C - PullRequest
       4

Дублировать GtkWidget на C

0 голосов
/ 28 апреля 2011

Я хочу продублировать GtkWidget, загруженный через GtkBuilder

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

static GtkWidget *my_widget(){

        GtkBuilder              *builder;  

        builder = gtk_builder_new ();
        gtk_builder_add_from_file (builder, "widget.glade", NULL);      
        return GTK_WIDGET (gtk_builder_get_object (builder, "widget"));
}

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

        gtk_init (&argc, &argv);

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

        window = GTK_WIDGET (gtk_builder_get_object (builder, "mainwindow"));
        gtk_builder_connect_signals (builder, NULL);    

        // Load widget into box
        int i;
        for (i=0; i<5; i++){
            gtk_box_pack_start( GTK_BOX (gtk_builder_get_object (builder, "widget_vbox")),
                                my_widget(),
                                FALSE,
                                TRUE,
                                0);

            if(i!=4){ // Don't add a seperator at the last loop
                widget = gtk_hseparator_new();
                gtk_box_pack_start( GTK_BOX (gtk_builder_get_object (builder, "solo_mission_vbox")),
                                    widget,
                                    FALSE,
                                    TRUE,
                                    0);
                gtk_widget_show(widget);

        }}}

Это заполняет окно с виджетом 5 раз с разделителями между ними.Проблема заключается в том, что программа открывает и закрывает один и тот же файл 5 раз, чтобы положить его на место.

Как я могу взять выходные данные компоновщика и "скопировать" его в 5 совершенно разных экземпляров?Вероятно, это связано с чем-то большим * с и & с.

1 Ответ

2 голосов
/ 29 апреля 2011

Вы не можете «копировать» виджеты, независимо от того, сколько указателей вы используете.То, как вы делаете это в приведенном выше примере, является правильным.Одним из улучшений является то, что вы можете переместить виджет в его собственный, меньший, файл конструктора.Если виджет небольшой, вы можете подумать о создании собственного класса виджетов и создании его вручную, а не из файла компоновщика.

PS.Если вы хотите запрограммировать приложение на C, вам лучше научиться не бояться указателей!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...