我是 GTK 和 C 的新手。我开始为嵌入式系统制作 UI。界面应该代表几个带有信息的选项卡,在这些选项卡之间切换是通过设备本身的按钮或来自配对设备(服务器)的 JS 命令来实现的。我正在尝试使用 GTK 和 Glade 来实现这一点。我在使用 GtkStack 时遇到了问题。我需要将堆栈页面的名称传递给服务器,以便服务器发回将显示在页面上的信息。
我尝试使用函数 gtk_widget_style_get
从空地文件中获取页面名称,但编译器发出警告 ../gtk+-3.24.27/gtk/gtkwidget.c:13324: widget class 'GtkStack' has no property named 'title'
并且程序显示“垃圾”而不是页面名称。我还尝试获取按钮的“标签”。 gtk_widget_style_get(btn_1, "title", &temp, NULL)
结果是一样的。
这是我正在试验的测试代码
main.c
#include <gtk/gtk.h>
#define UI_FILE "for_test.glade"
GtkBuilder *builder;
GtkWidget *window;
GtkWidget *stack;
GtkWidget *fix_1;
GtkWidget *lbl_1;
GtkWidget *btn_1;
GtkWidget *fix_2;
GtkWidget *lbl_2;
GtkWidget *btn_2;
void
on_btn_1_clicked(GtkWidget *widget)
{
gchar *temp[100];
gtk_widget_style_get(stack, "title", &temp, NULL);
gtk_label_set_text(GTK_LABEL(lbl_1), *temp);
}
void
on_window_destroy()
{
gtk_main_quit();
}
int
main (int argc, char *argv[])
{
gtk_init(&argc, &argv);
builder = gtk_builder_new_from_file(UI_FILE);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
stack = GTK_WIDGET(gtk_builder_get_object(builder, "stack"));
fix_1 = GTK_WIDGET(gtk_builder_get_object(builder, "fix_1"));
lbl_1 = GTK_WIDGET(gtk_builder_get_object(builder, "lbl_1"));
btn_1 = GTK_WIDGET(gtk_builder_get_object(builder, "btn_1"));
fix_1 = GTK_WIDGET(gtk_builder_get_object(builder, "fix_1"));
lbl_2 = GTK_WIDGET(gtk_builder_get_object(builder, "lbl_2"));
btn_2 = GTK_WIDGET(gtk_builder_get_object(builder, "btn_2"));
g_signal_connect(window, "destroy", G_CALLBACK(on_window_destroy), NULL);
g_signal_connect(btn_1, "clicked", G_CALLBACK(on_btn_1_clicked), NULL);
//g_signal_connect(btn_2, "clicked", G_CALLBACK(on_btn_2_clicked), NULL);
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
for_test.glade
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkWindow" id="window">
<property name="can-focus">False</property>
<property name="default-width">100</property>
<property name="default-height">200</property>
<signal name="destroy" handler="on_window_destroy" swapped="no"/>
<child>
<object class="GtkStack" id="stack">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkFixed" id="fix_1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkButton" id="btn_1">
<property name="label" translatable="yes">button 1</property>
<property name="width-request">100</property>
<property name="height-request">80</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_btn_1_clicked" swapped="no"/>
</object>
<packing>
<property name="y">100</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl_1">
<property name="width-request">100</property>
<property name="height-request">80</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
</child>
</object>
<packing>
<property name="name">page0</property>
<property name="title" translatable="yes">page0</property>
</packing>
</child>
<child>
<object class="GtkFixed" id="fix_2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkButton" id="btn_2">
<property name="label" translatable="yes">button 2</property>
<property name="width-request">100</property>
<property name="height-request">80</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_btn_2_clicked" swapped="no"/>
</object>
<packing>
<property name="y">100</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl_2">
<property name="width-request">100</property>
<property name="height-request">80</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
</child>
</object>
<packing>
<property name="name">page1</property>
<property name="title" translatable="yes">page1</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
我怀疑我使用了错误的函数来获取stackab页面的属性,但我还没有找到另一种获取它们的方法。我哪里做错了?
答案 0 :(得分:0)
这是其中一种解决方案:
GValue k = {0,};
g_value_init(&k, G_TYPE_STRING);
gtk_container_child_get_property(GTK_CONTAINER(stack), fix_1, "name", &k);
g_message("%s", g_value_get_string(&k));