如何在 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)
。
我正在使用 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)
。