通过GLADE XML中定义的ID编程将信号处理程序添加到小部件



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

我已经使用Gome-Builder的内置设计师创建了GUI,这只是GLADE,对于每个小部件,我都分配了一个ID。我只定义了ID,因为Gnome-Builder内置的GLADE的内置版本尚未完成,并且没有信号/处理程序的标签,因此GLADE的独立版本具有。

我想知道,如果有一种方法可以编程方式将信号处理程序/回调功能添加到XML中指定的ID中,而无需在XML本身中执行此操作,或使用独立的GLADE软件。

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

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

>

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

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

GIST地址:https://gist.github.com/jebiel/08fdf3b8fbbd34e09bd48d05d05d79d9cbf

短URL:http://gg.gg/eh4hn

是的,您可以做到这一点。您可以使用g_signal_connectg_signal_connect_object将处理程序连接到对象。前者将要求您在不再需要运行处理程序(即,当对象最终确定时(手动断开处理程序,稍后将在对象被销毁时为您做到这一点(即,最终确定(。<<<<<<

在对象准备使用后,您可以通过任何方法连接信号处理程序。下面,我覆盖将在构造对象(此处,BaCompressionWindow(之后运行的constructed方法。

最小示例将看起来像这样(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);
}

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

最新更新