通过在Glade xml中定义的ID以编程方式向小部件添加信号处理程序

时间:2019-07-07 15:20:58

标签: gtk signals handler glade gnome-builder

我正在尝试使用gnome-builder 3.22在c中使用gtk3.0创建GUI。

我使用gome-builder中的内置设计器创建了一个gui,这只是个空地,并且为每个小部件分配了一个ID。我只定义了ID,因为gnome-builder中内置的glade内置版本不完整,并且没有用于信号/处理程序的选项卡,只有Glade的独立版本具有此功能。

我想知道,是否有一种方法可以以编程方式将信号处理程序/回调函数添加到xml中指定的ID,而不必在xml本身中进行操作,也可以使用独立的Glade软件。

这是一个相当小的gui,所以一些额外的代码行不会困扰我。

我还尝试在xml中添加处理程序/回调,并使用gtkbuilder的自动连接功能自动连接这些处理程序/信号,但这也不起作用。

项目中的重要文件已上传到要点:

  • main.c
  • ba-compression-window.ui
  • ba-compression-window.c

主要地址:https://gist.github.com/Jebiel/08fdf3b8fbbd34e09bd48d05d79d9cbf

短网址:http://gg.gg/eh4hn

1 个答案:

答案 0 :(得分:0)

是的,您可以这样做。您可以使用g_signal_connectg_signal_connect_object将处理程序连接到对象。前一种将要求您在不再需要运行处理程序时(即,当对象完成时)手动断开处理程序,而后一种将在销毁(即完成)对象时为您完成。 / p>

在对象准备就绪后,可以用任何方法连接信号处理程序。下面,我覆盖了constructed方法,该方法将在构造对象(此处为BaCompressionWindow)之后运行。

一个最小的示例如下(back_button应该在.ui文件中定义):

static void
back_button_clicked_cb (GtkButton           *button,
                        BaCompressionWindow *self)
{
  g_assert (GTK_IS_BUTTON (button));
  g_assert (BA_IS_COMPRESSION_WINDOW (self));

  g_warning ("Back button clicked");
}

static void
ba_compression_window_constructed (GObject *object)
{
  BaCompressionWindow *self = (BaCompressionWindow *)self;

  G_OBJECT_CLASS (ba_compression_window_parent_class)->constructed (object);

  g_signal_connect (self->back_button, "clicked",
                   G_CALLBACK (back_button_clicked_cb),
                   self);
}

static void
ba_compression_window_class_init (BaCompressionWindowClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);

  object_class->constructed = ba_compression_window_constructed;
}

更简单的方法是在GtkBuilder .ui文件中添加信号处理程序,如下所示:

<object class="GtkButton" id="back_button">
  <property name="visible">1</property>
  <property name="label">Back</property>
  <signal name="clicked" handler="back_button_clicked_cb"
          object="BaCompressionWindow"/>
</object>

并将回调绑定到c文件中(其余内容请参考上面的代码)

static void
ba_compression_window_class_init (BaCompressionWindowClass *klass)
{
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);

  /* Other code */

  gtk_widget_class_bind_template_callback (widget_class, back_button_clicked_cb);
}

顺便说一句,请在此处添加相关代码,而不是链接到源文件