我如何拦截 gtk window 关闭按钮点击?
How do I intercept a gtk window close button click?
在 GTK window 上,标题栏中呈现了一个红色的关闭图标。通常,当您单击它时,window 会关闭并释放其资源。
有没有什么办法可以拦截正常的流程,不让window被破坏,让我以后再展示?即我想隐藏 window 而不是 close/destroy 它。
这是我目前所拥有的。
void destroy_window_callback(GtkWidget* widget, WebWindow_Linux* source)
{
printf("Don't destroy the window, just hide it.\n");
}
g_signal_connect(web_window, "destroy", G_CALLBACK(destroy_window_callback), this);
这可能就是您需要的
#include <gtk/gtk.h>
void
on_button_clicked(GtkButton *button, gpointer data)
{
GtkWidget *widget;
widget = (GtkWidget *) data;
if (widget == NULL)
return;
gtk_widget_show(widget);
return;
}
gboolean
on_widget_deleted(GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_widget_hide(widget);
return TRUE;
}
int
main(int argc, char **argv)
{
GtkWidget *window1;
GtkWidget *window2;
GtkWidget *button;
gtk_init(&argc, &argv);
window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label("Show again...");
g_signal_connect(G_OBJECT(window1),
"destroy", gtk_main_quit, NULL);
g_signal_connect(G_OBJECT(window2),
"delete-event", G_CALLBACK(on_widget_deleted), NULL);
g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(on_button_clicked), window2);
gtk_container_add(GTK_CONTAINER(window1), button);
gtk_widget_set_size_request(window1, 300, 100);
gtk_widget_set_size_request(window2, 300, 100);
gtk_widget_show_all(window1);
gtk_widget_show(window2);
gtk_main();
return 0;
}
我们基本上有三个小部件,两个顶级 windows 和一个按钮。当 window 的关闭按钮被按下时,第一个 window 将它的 "destroy"
事件连接到 gtk_main_quit()
退出应用程序。第二个 window 将其 "delete-event"
连接到自定义函数。这是最重要的。如您所见,returns TRUE
表示信号已被处理,从而阻止调用默认处理程序,从而阻止调用 gtk_widget_destroy()
。如果需要,我们也可以在其中隐藏小部件。
在 GTK window 上,标题栏中呈现了一个红色的关闭图标。通常,当您单击它时,window 会关闭并释放其资源。
有没有什么办法可以拦截正常的流程,不让window被破坏,让我以后再展示?即我想隐藏 window 而不是 close/destroy 它。
这是我目前所拥有的。
void destroy_window_callback(GtkWidget* widget, WebWindow_Linux* source)
{
printf("Don't destroy the window, just hide it.\n");
}
g_signal_connect(web_window, "destroy", G_CALLBACK(destroy_window_callback), this);
这可能就是您需要的
#include <gtk/gtk.h>
void
on_button_clicked(GtkButton *button, gpointer data)
{
GtkWidget *widget;
widget = (GtkWidget *) data;
if (widget == NULL)
return;
gtk_widget_show(widget);
return;
}
gboolean
on_widget_deleted(GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_widget_hide(widget);
return TRUE;
}
int
main(int argc, char **argv)
{
GtkWidget *window1;
GtkWidget *window2;
GtkWidget *button;
gtk_init(&argc, &argv);
window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label("Show again...");
g_signal_connect(G_OBJECT(window1),
"destroy", gtk_main_quit, NULL);
g_signal_connect(G_OBJECT(window2),
"delete-event", G_CALLBACK(on_widget_deleted), NULL);
g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(on_button_clicked), window2);
gtk_container_add(GTK_CONTAINER(window1), button);
gtk_widget_set_size_request(window1, 300, 100);
gtk_widget_set_size_request(window2, 300, 100);
gtk_widget_show_all(window1);
gtk_widget_show(window2);
gtk_main();
return 0;
}
我们基本上有三个小部件,两个顶级 windows 和一个按钮。当 window 的关闭按钮被按下时,第一个 window 将它的 "destroy"
事件连接到 gtk_main_quit()
退出应用程序。第二个 window 将其 "delete-event"
连接到自定义函数。这是最重要的。如您所见,returns TRUE
表示信号已被处理,从而阻止调用默认处理程序,从而阻止调用 gtk_widget_destroy()
。如果需要,我们也可以在其中隐藏小部件。