从空地文件中获取小部件的属性

时间:2021-05-26 08:38:50

标签: c gtk glade

我是 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页面的属性,但我还没有找到另一种获取它们的方法。我哪里做错了?

1 个答案:

答案 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)); 
相关问题