2016-11-09 3 views
0

Ich habe eine Lichtschnittstelle gemacht, wo es drei Expander gibt. Ich möchte nur, dass man zu jeder Zeit offen ist. Wenn also das Signal "activate" verwendet wird, wird eine Funktion expandlights() aufgerufen, und alle anderen Expander sollten schließen. Ich kann nicht herausfinden, wie man die anderen Expander von der Funktion beeinflusst. Unten war mein bester Versuch, es ist eindeutig sehr falsch. Ich bin SO neu dabei.GTK expanders one at at time

MAIN:

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

dies ist die Funktion i eindeutig versucht, die

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

ich auf dem richtigen Weg weiß nicht, ob im oder weg hier versagt. Könnte eine Schule benutzen!

Glade-Datei:

<?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"> 

Antwort

0

Ihre activate Handler muss die Unterschrift für das activate Signal definiert haben.

void 
expandlights (GtkExpander *expander, gpointer user_data); 

der Lage sein, die anderen Expander von dieser Funktion ändern Sie den user_data Zeiger zu verwenden, benötigen: macht es ist in der Regel auf eine Struktur zu verweisen, die Zeiger auf alle Widgets enthält, die Sie benötigen. Sie können den Zeigerwert mit gtk_builder_connect_signals() in Ihrer Initialisierung setzen, wenn Sie glade verwenden, wenn ich mich richtig erinnere.

Sie sollten in der Lage sein, den gleichen Handler für alle drei Expander zu verwenden, wenn Sie ihn sorgfältig codieren (wenn der Expander erweitert wird und dann alle Expander außer dem, der das Signal ausgegeben hat). Beachten Sie, dass beim Aufruf von gtk_expander_set_expanded() der Aktivierungssignal-Handler für diesen Expander aufgerufen wird. Dies sollte kein Problem für Ihren Fall sein, aber denken Sie daran - erstellen Sie keine unendliche Erweiterungsschleife.