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

时间:2019-05-04 09:42:49

标签: c gtk signals gtk3

我试图通过单击按钮退出应用程序。我目前在做Segfaults。

我曾经尝试在主叫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;
}

1 个答案:

答案 0 :(得分:1)

我正在使用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;
}
相关问题