通过单击按钮 GTK C 更改标签

changing label by clicking on button GTK C

我是使用 GTK+ 制作 GUI 的新手,我正在使用 glade 来构建 GUI,我试图通过单击按钮来简单地更改标签,这是我的代码:

#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <glib/gprintf.h>

typedef struct {
GtkWidget *window1 ;
GtkWidget *button1;
GtkWidget *label1;
}AppWidgets;

G_MODULE_EXPORT void on_button1_clicked(GtkButton *button,
                    gpointer user_data)
{
  AppWidgets * app = (AppWidgets *) user_data;
  gtk_label_set_text(GTK_LABEL(app->label1),"Hello World!");
}

int main (int argc, char *argv[])
{

 GtkBuilder  *builder;
 AppWidgets  *app=g_slice_new(AppWidgets) ;
 GError  *err=NULL;

 gtk_init(&argc, &argv);

 builder = gtk_builder_new();
 gtk_builder_add_from_file (builder, "GUI", &err);

 #define appGET(xx) \
 app->xx=GTK_WIDGET(gtk_builder_get_object(builder,#xx))

 appGET(window1);
 appGET(button1);
 appGET(label1);


 gtk_builder_connect_signals(builder, &app);
 g_object_unref(G_OBJECT(builder));


 gtk_widget_show(app->window1);
 gtk_main ();
 return 0;
}

这是我的 .glade 文件:

<?xml version="1.0"?>
<!-- Generated with glade 3.18.3 -->
<interface>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="resizable">true</property>
    <property name="default_width">500</property>
    <property name="default_height">1000</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="relief">none</property>
            <property name="focus_on_click">False</property>
            <signal name="clicked" handler="on_button1_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">label</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

这段代码什么都不做,所以我应该怎么做才能更改标签文本?

编译代码后,使用:

gcc -o test main.c -rdynamic `pkg-config --cflags --libs gtk+-3.0 gmodule-export-2.0`

可能 gmodule-export-2.0 将包含在 GTK 中,因此可能是多余的。

结果是标签不会改变,抛出到控制台的错误是:

Gtk-CRITICAL **: gtk_label_set_text: assertion 'GTK_IS_LABEL (label)' failed

这意味着 app->label1 不是 GtkLabel。

所以问题出在信号连接上:

gtk_builder_connect_signals(builder, &app);

此处应改为:

gtk_builder_connect_signals(builder, app);

来自 C API:

void gtk_builder_connect_signals (GtkBuilder *builder, gpointer user_data);