如何在 GTK+ 中检测鼠标点击图像?

Ali*_*scu 6 c gtk mouse

我正在使用 gtk+ 2.0 用 C 语言开发一个项目。

我必须检查用户是否按下了左键单击图像。我想在按下左键时调用一个函数并获取鼠标的位置,但是我该怎么做呢?

Eli*_*gem 5

我希望我可以假设您知道如何将事件连接到小部件,但如果不知道:这是我之前的答案,演示了如何做到这一点。

g_signal_connect 用于鼠标右键单击?

正如您在那里看到的,事件作为GdkEventButton *(event从现在开始)传递 。此结构具有您所追求的成员字段:event->x并且event->y都是gdouble字段。

无论如何,@unwind 是对的。正如 GTK 文档明确指出的那样:

GtkImage 是一个“无窗口”小部件(没有自己的 GdkWindow),因此默认情况下不接收事件。如果要接收图像上的事件,例如按钮点击,请将图像放在 GtkEventBox 中,然后连接到事件框上的事件信号。

GtkImage不是唯一的“无窗口”小部件,顺便说一句。GtkLabel例如,如果您想处理标签上的点击,则需要类似的方法。无论如何:更多信息在这里
然后手册页继续提供如何处理小部件点击的完整代码示例GtkImage。只需查找标题“在 GtkImage 上处理按钮按下事件”。完整的解释,但这里是代码,以防链接断开:

static gboolean
button_press_callback (GtkWidget      *event_box,
                       GdkEventButton *event,
                       gpointer        data)
{
    g_print ("Event box clicked at coordinates %f,%f\n",
         event->x, event->y);

    // Returning TRUE means we handled the event, so the signal
    // emission should be stopped (don’t call any further callbacks
    // that may be connected). Return FALSE to continue invoking callbacks.
    return TRUE;
}

static GtkWidget*
create_image (void)
{
    GtkWidget *image;
    GtkWidget *event_box;

    image = gtk_image_new_from_file ("myfile.png");

    event_box = gtk_event_box_new ();

    gtk_container_add (GTK_CONTAINER (event_box), image);

    g_signal_connect (G_OBJECT (event_box),
                  "button_press_event",
                  G_CALLBACK (button_press_callback),
                  image);

    return image;
}
Run Code Online (Sandbox Code Playgroud)


unw*_*ind 3

问题是用于在 GTK+ 中显示图像的GtkImage 小部件不会生成事件。

它是一个“nowindow”小部件,这意味着它是一个被动容器,用于显示信息而不是与用户交互。

您可以通过将图像包装在GtkEventBox中来解决此问题,这将添加事件支持。