一次一个 GTK 扩展器
GTK expanders one at at time
我制作了一个空地界面,其中有三个扩展器。我只想在任何给定时间打开一个。因此,当使用信号 "activate" 时,它会调用函数 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);
}
我不知道我是在正确的轨道上还是偏离了这里。可以用学校了!
空地文件:
<?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">
您的激活处理程序必须具有为激活信号定义的签名。
void
expandlights (GtkExpander *expander, gpointer user_data);
为了能够从此函数修改其他扩展器,您需要使用 user_data 指针:通常它指向一个结构,该结构包含指向您可能需要的所有小部件的指针。如果我没记错的话,您可以在使用 glade 时在初始化时使用 gtk_builder_connect_signals()
设置指针值。
如果你仔细编码,你应该能够对所有三个扩展器使用相同的处理程序(如果扩展器正在扩展,那么除了发出信号的扩展器之外的所有扩展器都将展开)。请注意,当您调用 gtk_expander_set_expanded()
时,将调用该扩展器的激活信号处理程序。这对您的情况应该不是问题,但请记住——不要创建一个永无止境的展开循环。
我制作了一个空地界面,其中有三个扩展器。我只想在任何给定时间打开一个。因此,当使用信号 "activate" 时,它会调用函数 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);
}
我不知道我是在正确的轨道上还是偏离了这里。可以用学校了!
空地文件:
<?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">
您的激活处理程序必须具有为激活信号定义的签名。
void
expandlights (GtkExpander *expander, gpointer user_data);
为了能够从此函数修改其他扩展器,您需要使用 user_data 指针:通常它指向一个结构,该结构包含指向您可能需要的所有小部件的指针。如果我没记错的话,您可以在使用 glade 时在初始化时使用 gtk_builder_connect_signals()
设置指针值。
如果你仔细编码,你应该能够对所有三个扩展器使用相同的处理程序(如果扩展器正在扩展,那么除了发出信号的扩展器之外的所有扩展器都将展开)。请注意,当您调用 gtk_expander_set_expanded()
时,将调用该扩展器的激活信号处理程序。这对您的情况应该不是问题,但请记住——不要创建一个永无止境的展开循环。