GTK3 - radiobutton: обратный вызов вызывается дважды каждый раз при переключении кнопки - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь использовать радиокнопку gtk3, следуя за ревом. Проблема в том, что я заметил, что функция обратного вызова вызывается дважды каждый раз, когда я нажимаю на кнопку. У меня вопрос, почему и как я могу изменить это для обратного вызова, который будет вызываться один раз, когда я нажимаю переключатель?

https://developer.gnome.org/gnome-devel-demos/stable/radiobutton.c.html.en

#include <gtk/gtk.h>

static void foo(GtkWidget *widget, gpointer data)
{
    char *id_radio = (char*)data;
    g_print("%s\n", id_radio);
}

int main(int argc, char *argv[])
{
    gtk_init(&argc, & argv);

    GtkWidget *radio_1, *radio_2, *radio_3, *vbox, *window;

    radio_1 = gtk_radio_button_new_with_label(NULL, "Radio 01");
    radio_2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_1), "Radio 02");
    radio_3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_1), "Radio 03");
    vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);                      
    g_signal_connect(GTK_TOGGLE_BUTTON(radio_1), "toggled", G_CALLBACK(foo), (gpointer)"1");
    g_signal_connect(GTK_TOGGLE_BUTTON(radio_2), "toggled", G_CALLBACK(foo), (gpointer)"2");
    g_signal_connect(GTK_TOGGLE_BUTTON(radio_3), "toggled", G_CALLBACK(foo), (gpointer)"3");

    gtk_box_pack_start(GTK_BOX(vbox), radio_1, 1, 1, 0);
    gtk_box_pack_start(GTK_BOX(vbox), radio_2, 1, 1, 0);
    gtk_box_pack_start(GTK_BOX(vbox), radio_3, 1, 1, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

1 Ответ

0 голосов
/ 27 января 2020

«Переключаемый» сигнал, который наследуется от переключателя, срабатывает как при деактивации, так и при активации. когда вы выбираете переключатель, ранее выбранная кнопка деактивируется (первый обратный вызов), а вновь нажатая активируется (второй обратный вызов).

Если вы хотите отфильтровать только активации, получите переключатель состояние кнопки внутри обратного вызова с gtk_toggle_button_get_active ().

Согласно документации от:

https://developer.gnome.org/gtk3/stable/GtkToggleButton.html#gtk -toggle-button-get-active

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...