Расширители GTK по одному за раз

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

ГЛАВНЫЙ:

int main(int argc, char *argv[])
{   
GtkBuilder      *builder; 
GtkWidget       *window;
gtk_init(&argc, &argv);

builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "interface.ui", NULL);

window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
gtk_builder_connect_signals(builder, NULL);

g_object_unref(builder);

gtk_widget_show(window);                
gtk_main();

return 0;
}

это функция, которую я пытался, которая явно терпит неудачу

void expandlights(  GtkWidget    *expander1,
                    GtkWidget    *expander2,
                    GtkWidget    *expander3)
{
    gtk_expander_set_expanded(expander2, FALSE);
    gtk_expander_set_expanded(expander3, FALSE);
}

Я не знаю, на правильном ли я пути или здесь. Мог бы использовать schoolin!

Поляна файл:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
  <requires lib="gtk+" version="3.12"/>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkExpander" id="expander1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <signal name="activate" handler="expandlights" swapped="no"/>
            <child>
              <object class="GtkLabel" id="label4">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">lighting stuff</property>
              </object>
            </child>
            <child type="label">
              <object class="GtkLabel" id="label1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">Lights</property>
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkExpander" id="expander2">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <signal name="activate" handler="expandalarm" swapped="no"/>
            <child>
              <object class="GtkLabel" id="label5">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">Alarm stuff</property>
              </object>
            </child>
            <child type="label">

1 ответ

  1. Обработчик активации должен иметь сигнатуру, определенную для сигнала активации.

    void
    expandlights (GtkExpander *expander, gpointer user_data);
    

    Чтобы изменить другие расширители с помощью этой функции, необходимо использовать указатель user_data: обычно он указывает на структуру, содержащую указатели на все виджеты, которые могут вам понадобиться. Вы можете установить значение указателя gtk_builder_connect_signals()в вашей инициализации при использовании glade, если я правильно помню.

    Вы можете использовать один и тот же обработчик для всех трех экспандеров, если вы тщательно его кодируете (если расширитель расширяется, то расширяйте все экспандеры, кроме того, который испустил сигнал). Обратите внимание, что при вызове gtk_expander_set_expanded()обработчика сигнала активации для этого расширителя будет вызван. Это не должно быть проблемой для вашего случая, но имейте это в виду-не создавайте бесконечный цикл расширения.