【问题标题】:gtk signals and exiting program with using themgtk 信号和使用它们退出程序
【发布时间】:2014-01-16 19:50:12
【问题描述】:

我如何使用 gtk 信号退出一个窗口,然后一个对话消息显示你确定的问题吗?并通过单击是按钮关闭所有窗口? 这是我的代码:

void show_queExit(GtkWidget *widget, gpointer window)
{
    GtkWidget *dialog;
    dialog = gtk_message_dialog_new(GTK_WINDOW(window),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_QUESTION,
            GTK_BUTTONS_YES_NO,
            "Are you sure to exit?");
    gtk_window_set_title(GTK_WINDOW(dialog), "Exit");
    gint result = gtk_dialog_run (GTK_DIALOG (dialog));

    if (result==GTK_RESPONSE_YES)
    {
        g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit),NULL);
        gtk_widget_destroy (dialog);
        printf("\n***\n");
    }
    else
        gtk_widget_destroy (dialog);
}

这是我的主要功能: int main(int argc, char **argv) {

    gtk_init(&argc, &argv);

    GtkWidget *window;
    GtkToolItem *exitIcon;
    GtkWidget *toolbar;


    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    toolbar = gtk_toolbar_new();
    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);


    exitIcon = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exitIcon, -1);


    gtk_window_set_default_size(GTK_WINDOW(window), win_width, win_height);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    g_signal_connect(G_OBJECT(exitIcon), "clicked",G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

【问题讨论】:

  • 不完全清楚你想要什么,但我猜你想为顶层窗口的“delete-event”信号添加一个处理程序,并从该处理程序显示你的对话框。跨度>
  • 对不起,我的英语不好。是的,我想这样做。我该怎么办?

标签: gtk


【解决方案1】:

类似这样的东西:

static gboolean on_delete_event (GtkWidget *window,
                                 GdkEvent  *event,
                                 gpointer   data)
{
    GtkWidget *dialog;
    int answer;

    dialog = gtk_message_dialog_new (GTK_WINDOW(window),
                                     GTK_DIALOG_DESTROY_WITH_PARENT,
                                     GTK_MESSAGE_QUESTION,
                                     GTK_BUTTONS_YES_NO,
                                     "Are you sure to exit?");
    gtk_window_set_title (GTK_WINDOW(dialog), "Exit");

    answer = gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy (dialog);

    if (answer == GTK_RESPONSE_YES) {
        g_print ("Yes\n");
        return FALSE;
    } else {
        g_print ("No\n");
        return TRUE;
    }

}

然后在main()或者一些初始化函数中:

g_signal_connect (window, "delete-event",
                  G_CALLBACK (on_delete_event), NULL);

有几种方法可以处理应用程序退出——你可以从上面的函数中调用 gtk_main_quit(),或者你可以做我认为你最初尝试过的事情:让 GTK 在用户单击 YES 时销毁窗口,然后调用 gtk_main_quit () 来自销毁信号处理程序。

在任何情况下,如果您希望对话框出现,将退出图标"clicked" signal 连接到 gtk_main_quit() 是错误的:您应该将信号连接到您编写的调用 gtk_window_close() 的函数。

g_signal_connect (exitIcon, "clicked",
                  G_CALLBACK (on_exit_clicked), window);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2017-09-05
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多