【发布时间】:2021-05-26 08:38:50
【问题描述】:
我是 GTK 和 C 的新手。我开始为嵌入式系统制作 UI。界面应该代表几个带有信息的选项卡,通过设备本身的按钮或配对设备(服务器)的 JS 命令在这些选项卡之间进行切换。我正在尝试使用 GTK 和 Glade 来实现这一点。我在使用 GtkStack 时遇到了问题。我需要将堆栈页面的名称传递给服务器,以便服务器发回将显示在页面上的信息。
我尝试使用函数gtk_widget_style_get 从glade 文件中获取页面名称,但编译器发出警告../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 页面的属性,但我还没有找到其他方法来获取它们。我哪里做错了?
【问题讨论】:
-
您可以使用 gtk_button_set_label 设置按钮的标签 - 在此处阅读详细信息:developer.gnome.org/gtk3/stable/…。所以,基本上你会使用 gtk_builder_get_object 来检索按钮或窗口,然后设置标签或标题
-
@muzzletov 谢谢,但我需要做一些不同的事情。该解决方案是由一位同事提出的。这里是:``` 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)); ```
-
哦,我明白了。 xD 我以为你有不同的目标。您介意添加答案,以便人们可以从您的发现中受益吗?