是的,你可以这么做。您可以使用g_signal_connect
或g_signal_connect_object
将处理程序连接到对象。前者将要求您在不再需要运行处理程序时手动断开处理程序(即,当对象最终确定时),后者将在对象被销毁(即,最终确定)时为您执行此操作。
在对象准备好使用后,您可以通过任何方法连接信号处理程序。下面,我重写了构造constructed
对象 (Here, ) 后将运行的方法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);
}
顺便说一句,请在此处添加相关代码,而不是链接到源文件