GTK + Как узнать, какая радио-кнопка выбрана? - PullRequest
3 голосов
/ 11 января 2012

Учебник здесь http://developer.gnome.org/gtk-tutorial/2.90/x542.html показывает, как настроить переключатели, но не рассказывает, как их использовать.

Как мне узнать, какой переключатель выбран?

Мое решение:

Инициализация переключателей с помощью:

rbutton1 = gtk_radio_button_new_with_label(NULL, "button1");
gtk_box_pack_start(GTK_BOX(rbutton_box), rbutton1, TRUE, TRUE, 0);

rbuttonGroup = gtk_radio_button_get_group(GTK_RADIO_BUTTON(rbutton1)); /*not sure what I'd use this line for currently though*/
rbutton2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(rbutton1), "button 2"); 
gtk_box_pack_start(GTK_BOX(rbutton_box), rbutton2, TRUE, TRUE, 0);

rbutton3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(rbutton1), "button 3"); 
gtk_box_pack_start(GTK_BOX(rbutton_box), rbutton3, TRUE, TRUE, 0);

И обновите переменную, сообщив, какая радио-кнопка выбрана с помощью этого метода:

        void checkRadioButtons()
{
    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutton1))==TRUE) selectedRadioButton =1;
    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutton2))==TRUE) selectedRadioButton =2;
    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rbutton3))==TRUE) selectedRadioButton =3;
}

Ответы [ 6 ]

2 голосов
/ 10 мая 2015

Google привел меня сюда для поиска python / pygtk / pygtk3, поэтому я надеюсь, что все в порядке, что я выложил решение pygtk:

def _resolve_radio(self, master_radio):
    active = next((
        radio for radio in
        master_radio.get_group()
        if radio.get_active()
    ))
    return active

При этом используется генератор для возврата первого (который должен быть только ) активного активного радиоблока.

1 голос
/ 25 апреля 2014

Вот как я это делаю.

GtkRadioButton * radio_button;
GtkRadioButton * radio_button1;
GtkRadioButton * radio_button2;
...
GSList * tmp_list = gtk_radio_button_get_group (radio_button);//Get the group of them.
GtkToggleButton *tmp_button = NULL;//Create a temp toggle button.

while (tmp_list)//As long as we didn't reach the end of the group.
{
  tmp_button = tmp_list->data;//Get one of the buttons in the group.
  tmp_list = tmp_list->next;//Next time we're going to check this one.

  if (gtk_toggle_button_get_active(tmp_button))//Is this the one active?
    break;//Yes.

  tmp_button = NULL;//We've enumerated all of them, and none of them is active.
}
//Here. tmp_button holds the active one. NULL if none of them is active.

Смотрите обсуждение здесь . Я не знаю, добавят ли они эту функцию в нее (кажется, нет).

0 голосов
/ 21 июня 2016

Вот как я предлагаю это сделать:

void radio_button_selected (GtkWidget *widget, gpointer data) 
{
    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))
    {
        GSLIST *group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
        g_print ("Index = %i%\n", g_slist_index (group, widget));
    }
}
0 голосов
/ 17 ноября 2013

Используйте лямбда-выражения, если вы не хотите возиться с назойливыми методами, все равно придется использовать connect, хотя его гораздо легче читать:

Enum RadioValues { A, B, C, none };

RadioValues values = RadioValues.none; // only needed if you dont have an initially selected radio button

MyConstructor()
{
   Build();
   // asumming you have 3 radio buttons: radioA, radioB, radioC:
   radioA.Toggled += (sender,e) => values = RadioValues.A;
   radioB.Toggled += (sender,e) => values = RadioValues.B;
   radioC.Toggled += (sender,e) => values = RadioValues.C;

}

и это все, никаких методов для решенияи вам не нужно ограничиваться только этим, вы также можете использовать анонимную функцию, если вам нужно больше гибкости - конечно, следующий шаг после этого - использование методов.К сожалению, они не предложили простого свойства .Checked, мое следующее предложение - переопределить сам переключатель и связать свойство Checked при изменении его переключенного состояния, эмулируя другие фреймворки, такие как MFC, Qt и Winforms ... и т.д.

PS: я упустил шаблонный код для простоты, который может сделать ответы немного более запутанными, и вам, вероятно, просто нужны факты, а не демонстрация того, могу ли я правильно вызывать конструктор:)

0 голосов
/ 11 января 2012

Давайте создадим серию кнопок:

for severity in levels:
    radio = gtk.RadioButton(group=radioButtons, label=severity)
    if severity == actualLevel:
        radio.set_active(True)
    hBox.pack_start(radio, True, True, 3)
    radio.connect('toggled', self.radioButtonSelected, severity)

и все кнопки подключены к одному и тому же обработчику:

def radioButtonSelected(self, button, currentSeverity):
    # proceed with the task
    # as you can see, button is passed by as argument by the event handler
    # and you can, for example, get the button label :
    labelReadFromButton = button.getLabel()
0 голосов
/ 11 января 2012

Вместо этого вы можете подключиться к сигналу GtkToggleButton::toggled. В соответствующем обратном вызове вы сможете обновить свою переменную. Что касается вызова на gtk_radio_button_get_group, он понадобится вам, только если вы наберете gtk_radio_button_new_with_label вместо gtk_radio_button_new_with_label_with_widget, как указано в учебнике, к которому вы обращаетесь.

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