如何在 C 中使用 GTK 4.0 class 的继承方法

How to use inherited method of a GTK 4.0 class in C

我正在使用 Gtk4 用 C(不是 C++)编写程序。

我想在单个处理程序中处理鼠标点击(可能还有其他事件)。

/* Setting up the handler */
static void activate(GtkApplication *app, gpointer data) 
{
  /* ... */
  click = gtk_gesture_click_new();
  /* ... */
  g_signal_connect(click, 
                   "pressed",
                   G_CALLBACK(click_handler),
                   drawing_area);
}

static void click_handler(GtkGestureClick   *gesture,
                          int                n_press,
                          double             x,
                          double             y,
                          GtkWidget         *area)
{
  guint button = gtk_gesture_single_get_button(gesture); /* !!! */
  switch (button) {
  case 1:
    /* handle leftclick */
    break;
  /* ... */
  }
  /* ... */
}

将根据 signal's documentation GtkGestureClick 传递给处理程序, 但是 gtk_gesture_single_get_button() needs it's parent class GtkGestureSingle

我的问题是,如何在 C 中使用 Gtk class 实例的继承方法?

我只是想简单地将它转换为它的父类型,但我不确定这是否是“Gtk 方式”。

此外,如果您能附上可以查看此信息的页面,那就太好了。我正在查看 Gtk4's and GObject 的文档,但没有找到我需要的东西。

I was thinking just simply casting it to it's parent's type, but I'm not sure if this is "The Gtk way".

你很接近但不完全正确。 如果您只使用强制转换,您可能会满足编译器的要求,但据我所知,GTK 对象中存储的类型信息将不匹配。

你可以看看Gtk方式是什么here:

如果您有派生对象 (GtkWidget*window) 但需要父对象 class (GtkWindow*),您可以使用 GTK_WINDOWS(window).

转换它

在您上面的代码片段中使用了相同的机制G_CALLBACK(click_handler)。这些宏可以完成所需的工作,而不仅仅是简单的强制转换。

对于您的代码,请尝试使用 GTK_GESTURE_SINGLE(gesture)