GTK一次扩展一个

时间:2016-11-09 14:47:57

标签: c gtk gtk3 glade

我做了一个林间界面,里面有三个扩展器。我只想让一个人在任何时候都开放。因此,当使用信号“activate”时,它会调用函数expandlights(),并且所有其他扩展器都应该关闭。我无法弄清楚如何从函数中影响其他扩展器。下面是我最好的尝试,显然非常错误。我是新来的。

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

我不知道我是否在正确的轨道或离开这里。可以使用学校!

Glade文件:

<?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 个答案:

答案 0 :(得分:0)

您的激活处理程序必须具有为激活信号定义的签名。

void
expandlights (GtkExpander *expander, gpointer user_data);

为了能够从这个函数修改其他扩展器,你需要使用user_data指针:通常它指向一个包含指向你可能需要的所有小部件的指针的结构。如果我没记错的话,你可以在使用glade时在初始化时用gtk_builder_connect_signals()设置指针值。

如果您仔细编码,则应该能够为所有三个扩展器使用相同的处理程序(如果扩展器正在扩展,那么除了发出信号的扩展器之外的所有扩展器都要展开)。请注意,当您调用gtk_expander_set_expanded()时,将调用该扩展器的激活信号处理程序。对于您的情况,这应该不是问题,但请记住 - 不要创建永无止境的扩展循环。