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

How do I quit a gtk application from a button click?

我正在尝试通过单击按钮退出应用程序。我目前在做什么

我试过在 main 中调用 g_application_quit(G_APPLICATION(app)); 它仍然是段错误

调用gtk_widget_destroy(window);也出现段错误

#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;
}

我正在使用 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;
}

destroy 移到 activate 之外。

#include <stdlib.h>
#include <gtk/gtk.h>

void destroy (GtkWidget* widget, gpointer data)
{
    g_application_quit(G_APPLICATION(data));
}

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(GTK_BUTTON(button), "clicked", G_CALLBACK(destroy), app);
    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;
}