【问题标题】:Getting properties of widgets from a glade file从 glade 文件中获取小部件的属性
【发布时间】: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 我以为你有不同的目标。您介意添加答案,以便人们可以从您的发现中受益吗?

标签: c gtk glade


【解决方案1】:

这是解决方案之一:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多