2016-11-09 7 views
0

私は3つのエキスパンダーがあるところで隙間のインターフェースを作った。私は、いつでも誰かが開いてほしいです。したがって、シグナル "activate"が使用されると、expandlights()関数が呼び出され、他のすべてのエクスパンダが閉じるはずです。私は関数から他のエクスパンダにどのように影響を与えるかを理解できません。私の最善の試みは、明らかに非常に間違っていた。私はとても新しいです。GTKエキスパンダー一度に

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

が、これは明らかに

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

を失敗した私が試み関数である私は、イム場合は正しい軌道に乗ってか、遠く離れて、ここで知ってはいけません。学校を使うことができました!

グレイドファイル:

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

答えて

0

あなたのアクティベートハンドラは起動信号用に定義された署名を持っている必要があります。

void 
expandlights (GtkExpander *expander, gpointer user_data); 

は、あなたがたuser_dataポインタを使用する必要があります。この機能から他のパンダを修正することができるようにするには:一般的に、あなたが必要とする可能性のあるすべてのウィジェットへのポインタが含まれている構造体を指すように作られています。あなたが正しく想起された場合は、gladeを使用する際に、初期化時にポインタ値をgtk_builder_connect_signals()に設定することができます。

3つのエクスパンダをすべて慎重にコーディングしている場合(エクスパンダが展開されていて、信号を送出したエクスパンダ以外のすべてのエクスパンダを展開していない場合)同じハンドラを使用できるはずです。 gtk_expander_set_expanded()に電話すると、そのエキスパンダー用のシグナルハンドラが呼び出されることに注意してください。これはあなたのケースでは問題ではありませんが、心に留めておいてください。終わりのない展開ループを作成しないでください。

関連する問題