【问题标题】:Programmatically add signal handlers to widgets by id defined in glade xml通过在 glade xml 中定义的 id 以编程方式将信号处理程序添加到小部件
【发布时间】:2019-11-17 07:02:31
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: gtk signals handler glade gnome-builder


    【解决方案1】:

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

    您可以在对象准备好使用后以任何方法连接信号处理程序。下面,我重写了 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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 2017-02-22
      相关资源
      最近更新 更多