首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GTK3 : gtk_widget_destroy与gtk_widget_hide

GTK3 : gtk_widget_destroy与gtk_widget_hide
EN

Stack Overflow用户
提问于 2018-03-05 09:35:13
回答 1查看 1.2K关注 0票数 0

这里有一个简短的MCV来说明我遇到的问题:

我从主窗口调用一个对话框。我单击对话框中的一个按钮(我认为通常的方式),如果我再次单击一个按钮,对话框将不会再次显示(我得到了一堆错误)。这种情况不会发生在我使用gtk_widget_hide代替。(接口使用Glade3设计)

代码语言:javascript
复制
typedef struct {
    GtkBuilder *builder;
    gchar *stuff;
} Context;

void conDisplay(GtkWidget *g, gpointer userdata) {
    GtkWidget *dlg, *parent;
    Context *ctx=(Context *)userdata;
    int ret=0;

    g_printerr("clicked\n");

    parent=GTK_WIDGET(gtk_builder_get_object(ctx->builder,(gchar *)"MCV"));
    if (ctx->stuff) {
        g_printerr("Already connected\n");
        dlg=GTK_WIDGET(gtk_builder_get_object(ctx->builder,(gchar *)"question"));
        gtk_window_set_transient_for(GTK_WINDOW(dlg),GTK_WINDOW(parent));
        ret=gtk_dialog_run(dlg);
        if (ret==-3) { // OK clicked
            g_printerr("OK from Already connected\n");
        }
        else { g_printerr("Unknown\n"); }
        gtk_window_set_transient_for(GTK_WINDOW(dlg),NULL);
        gtk_widget_destroy(GTK_WIDGET(dlg));
    } else {
        dlg=GTK_WIDGET(gtk_builder_get_object(ctx->builder,(gchar *)"connect"));
        gtk_window_set_transient_for(GTK_WINDOW(dlg),GTK_WINDOW(parent));
        ret=gtk_dialog_run(dlg);
        if (ret==-1) { // GO clicked
            g_printerr("GO\n");
            ctx->stuff="Hello";
        }
        else { g_printerr("Cancel\n"); }
        gtk_window_set_transient_for(GTK_WINDOW(dlg),NULL);
        gtk_widget_destroy(GTK_WIDGET(dlg));
    }
}

int main(int argc, char **argv)
{
    Context ctx;
    GtkWidget *mainwin;
    GtkWidget *btnCon;
    GError *error=NULL;

    /* Init GTK+ */
    gtk_init(&argc,&argv);
    ctx.builder=gtk_builder_new();
    ctx.stuff=NULL;
    // Load UI from file.
    gtk_builder_add_from_file(ctx.builder,"mcv.glade",&error);

    mainwin=GTK_WIDGET(gtk_builder_get_object(ctx.builder,(gchar *)"MCV"));
    btnCon=GTK_WIDGET(gtk_builder_get_object(ctx.builder,(gchar *)"con"));
    g_signal_connect(btnCon, "clicked", (GCallback)conDisplay, &ctx);

    gtk_widget_show_all(mainwin);

    gtk_main();
    return 0;
}

谢谢你的帮助!

诚挚的问候。

V。

EN

回答 1

Stack Overflow用户

发布于 2018-03-22 11:14:00

来自GtkBuilder

GtkBuilder保存对它所构造的所有对象的引用,并在最终完成时删除这些引用。这种终结会导致非小部件对象或小部件的破坏,这些对象或小部件不包含在toplevel窗口中。对于由构建器构造的toplevel窗口,用户有责任调用gtk_widget_destroy()来消除它们和它们包含的所有小部件。

由于GtkWindow,我建议将mainwindlg,GtkBuilders和gladefiles分开,并在conDisplay中使用临时GtkBuilder

代码语言:javascript
复制
void conDisplay(GtkWidget *g, gpointer userdata) {
    GtkWidget *dlg, *parent;
    Context *ctx=(Context *)userdata;
    GtkBuilder *builder = gtk_builder_new_from_file("dlg.glade"); //or even pass glade filename in Context
    /* rest of the code */
    gtk_widget_destroy(GTK_WIDGET(dlg));
    g_object_unref(G_OBJECT(builder));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49107222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档