C 如何通过单击按钮退出gtk应用程序?

C 如何通过单击按钮退出gtk应用程序?,c,gtk,signals,gtk3,C,Gtk,Signals,Gtk3,我正试图通过单击按钮退出应用程序。我现在正在做的事情 我试过调用g_application_quit(g_application(app))在主信息系统中,它仍然存在故障 #include <stdlib.h> #include <gtk/gtk.h> void activate(GtkApplication* app, gpointer data) { GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL)

我正试图通过单击按钮退出应用程序。我现在正在做的事情

我试过调用
g_application_quit(g_application(app))在主信息系统中,它仍然存在故障

#include <stdlib.h>
#include <gtk/gtk.h>
void activate(GtkApplication* app, gpointer data)
{
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_application_add_window(app, GTK_WINDOW(window));
    GtkWidget *button = gtk_button_new_with_label("Button");
    void shutdown()
    {
        g_application_quit(G_APPLICATION(app));
    }
    g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(shutdown), NULL);
    gtk_container_add(GTK_CONTAINER(window), button);
    gtk_widget_show(button);
    gtk_window_present(GTK_WINDOW(window));
}

int main (int argc, char *argv[])
{
    GApplicationFlags flags = G_APPLICATION_FLAGS_NONE;
    GtkApplication *app = gtk_application_new("com.devab.daw", flags);
    GApplication *gapp = G_APPLICATION(app);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    g_application_run(gapp, argc, argv);
    g_object_unref (app);
    //g_application_quit(G_APPLICATION(app));
    return 0;
}
调用
gtk\u widget\u destroy(窗口)也可以识别故障

#include <stdlib.h>
#include <gtk/gtk.h>
void activate(GtkApplication* app, gpointer data)
{
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_application_add_window(app, GTK_WINDOW(window));
    GtkWidget *button = gtk_button_new_with_label("Button");
    void shutdown()
    {
        g_application_quit(G_APPLICATION(app));
    }
    g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(shutdown), NULL);
    gtk_container_add(GTK_CONTAINER(window), button);
    gtk_widget_show(button);
    gtk_window_present(GTK_WINDOW(window));
}

int main (int argc, char *argv[])
{
    GApplicationFlags flags = G_APPLICATION_FLAGS_NONE;
    GtkApplication *app = gtk_application_new("com.devab.daw", flags);
    GApplication *gapp = G_APPLICATION(app);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    g_application_run(gapp, argc, argv);
    g_object_unref (app);
    //g_application_quit(G_APPLICATION(app));
    return 0;
}
#包括
#包括
无效激活(GTK应用程序*应用程序、gpointer数据)
{
GtkWidget*window=gtk_window_new(gtk_window_TOPLEVEL);
gtk_应用程序_添加_窗口(应用程序,gtk_窗口(窗口));
GtkWidget*button=gtk_button_new_带_标签(“按钮”);
无效关机()
{
g_应用程序_退出(g_应用程序(app));
}
g_信号连接(GTK_按钮(按钮),“点击”,g_回调(关闭),空);
gtk_容器添加(gtk_容器(窗口),按钮);
gtk_小部件_显示(按钮);
gtk_窗口(窗口)存在(gtk_窗口(窗口));
}
int main(int argc,char*argv[])
{
GAApplicationFlags flags=G_应用程序标志\u无;
GtkApplication*app=gtk_application_new(“com.devab.daw”,flags);
gapp=G_应用程序(app);
g_信号连接(应用程序,“激活”,g_回调(激活),空);
g_应用程序运行(gapp、argc、argv);
g_object_unref(应用程序);
//g_应用程序_退出(g_应用程序(app));
返回0;
}

我正在使用gtk3,它为我编译并运行

#include <stdlib.h>
#include <gtk/gtk.h>
void activate(GtkApplication* app, gpointer data)
{
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_application_add_window(app, GTK_WINDOW(window));
    GtkWidget *button = gtk_button_new_with_label("Button");
    g_signal_connect_swapped(GTK_BUTTON(button), "clicked", G_CALLBACK(gtk_widget_destroy), window);
    gtk_container_add(GTK_CONTAINER(window), button);
    gtk_widget_show(button);
    gtk_window_present(GTK_WINDOW(window));
}

int main (int argc, char *argv[])
{
    GApplicationFlags flags = G_APPLICATION_FLAGS_NONE;
    GtkApplication *app = gtk_application_new("com.devab.daw", flags);
    GApplication *gapp = G_APPLICATION(app);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    g_application_run(gapp, argc, argv);
    g_object_unref (app);
    //g_application_quit(G_APPLICATION(app));
    return 0;
}

我需要@xing的可能副本gtk3@swordfish可能的重复没有显示如何连接信号。这就是为什么它也没有被选为答案第一个答案有效,但第二个答案
g_application_quit(g_application(data))第二个就像一个符咒,我更喜欢它,而不是破坏窗户