Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从glade文件获取小部件的属性_C_Gtk_Glade - Fatal编程技术网

C 从glade文件获取小部件的属性

C 从glade文件获取小部件的属性,c,gtk,glade,C,Gtk,Glade,我是GTK和C的新手。我开始为嵌入式系统制作UI。该界面应表示多个带有信息的选项卡,通过设备本身上的按钮或来自配对设备(服务器)的JS命令在这些选项卡之间进行切换。我正试图用GTK和Glade实现这一点。我在使用GtkStack时遇到问题。我需要将堆栈页面的名称传递给服务器,以便服务器发回将在页面上显示的信息。 我试图使用函数gtk_widget_style_get从glade文件中获取页面名称,但编译器发出警告。/gtk+-3.24.27/gtk/gtkwidget.c:13324:widge

我是GTK和C的新手。我开始为嵌入式系统制作UI。该界面应表示多个带有信息的选项卡,通过设备本身上的按钮或来自配对设备(服务器)的JS命令在这些选项卡之间进行切换。我正试图用GTK和Glade实现这一点。我在使用GtkStack时遇到问题。我需要将堆栈页面的名称传递给服务器,以便服务器发回将在页面上显示的信息。 我试图使用函数
gtk_widget_style_get
从glade文件中获取页面名称,但编译器发出警告
。/gtk+-3.24.27/gtk/gtkwidget.c:13324:widget类“GtkStack”没有名为“title”的属性
,程序显示“垃圾”而不是页面名称。我还试图得到按钮的“标签”
gtk\u widget\u style\u get(btn\u 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;
}
#包括
#定义UI_文件“for_test.glade”
GtkBuilder*builder;
GtkWidget*窗口;
GtkWidget*堆栈;
GtkWidget*fix_1;
GtkWidget*lbl_1;
GtkWidget*btn_1;
GtkWidget*fix_2;
GtkWidget*lbl_2;
GtkWidget*btn_2;
无效的
在btn上单击(GtkWidget*小部件)
{
gchar*温度[100];
gtk_widget_style_get(堆栈,“标题”&临时,空);
gtk_标签设置文字(gtk_标签(lbl_1),*温度);
}
无效的
在_window _destroy()上
{
gtk_main_quit();
}
int
main(int argc,char*argv[])
{
gtk_init(&argc,&argv);
builder=gtk_builder_new_from_文件(UI_文件);
window=GTK_小部件(GTK_builder_get_对象(builder,window));
stack=GTK_小部件(GTK_builder_get_对象(builder,“stack”));
fix_1=GTK_小部件(GTK_生成器_获取_对象(生成器,“fix_1”));
lbl_1=GTK_小部件(GTK_生成器_获取_对象(生成器,“lbl_1”));
btn_1=GTK_小部件(GTK_生成器_获取_对象(生成器,“btn_1”));
fix_1=GTK_小部件(GTK_生成器_获取_对象(生成器,“fix_1”));
lbl_2=GTK_小部件(GTK_生成器_获取_对象(生成器,“lbl_2”));
btn_2=GTK_小部件(GTK_生成器_获取_对象(生成器,“btn_2”));
g_信号_连接(窗口,“销毁”,g_回调(在窗口_销毁),空);
g_信号连接(btn_1,“点击”,g_回调(在btn_1上点击),NULL);
//g_信号连接(btn_2,“点击”,g_回调(在btn_2上点击),空);
gtk_builder_connect_信号(builder,NULL);
g_object_unref(建筑商);
gtk_widget_show(窗口);
gtk_main();
返回0;
}
供你测试

    <?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>

假的
100
200
真的
假的
真的
假的
按钮1
100
80
真的
真的
真的
100
100
80
真的
假的
标签
第0页
第0页
真的
假的
按钮2
100
80
真的
真的
真的
100
100
80
真的
假的
标签
第1页
第1页
1.

我怀疑我使用了错误的函数来获取stackab页面的属性,但我还没有找到其他方法来获取它们。我哪里出错了?

以下是解决方案之一:

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

您可以使用gtk_button_set_label设置按钮的标签-阅读此处的详细信息:。因此,基本上您可以使用gtk_builder_get_对象检索按钮或窗口,然后设置标签或title@muzzletov谢谢,但是我需要做一些不同的事情。解决方案是由一位同事提出的。这里是:``GValue k={0,};g_value_init(&k,g_TYPE_STRING);gtk_container_child_get_属性(gtk_container(stack)、fix_1、“name”、&k);g_消息(“%s”,g_值_获取_字符串(&k))```哦,我明白了。xD我以为你心里有一个不同的目标。你介意添加一个答案吗,这样人们就可以从你的发现中受益?