在C中复制GtkWidget

时间:2011-04-28 16:59:31

标签: c pointers gtk

我想复制通过GtkBuilder加载的GtkWidget

我的问题是告诉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个完全不同的实例中?它可能涉及很多*& s。

1 个答案:

答案 0 :(得分:2)

无论您使用多少指针,都无法“复制”小部件。您在上面的示例中执行此操作的方式是正确的。一个改进是您可以将窗口小部件移动到其自己的较小的构建器文件中。如果窗口小部件很小,您可以考虑制作自己的窗口小部件类并手动构建它,而不是从构建器文件构建。

PS。如果你想用C编写应用程序,你最好学会不要害怕指针!