Events 是否检测Gtk::Image上的单击?

Events 是否检测Gtk::Image上的单击?,events,gtkmm,Events,Gtkmm,我一直在用gtkmm检测点击Gtk::Image超过2个小时,但我无法让它工作。它确实可以很好地编译和执行,但事件从未被触发 我试过的一些东西,可以编译,不会崩溃,但不起作用: m_image=manage(新的Gtk::image(Gtk::Stock::APPLY,Gtk::ICON_SIZE_按钮)); m_映像->添加_事件(Gdk::所有_事件\u掩码); m_hbox->pack_start(*m_图像,Gtk::pack_SHRINK); m_图像->信号按钮释放事件() .con

我一直在用gtkmm检测点击
Gtk::Image
超过2个小时,但我无法让它工作。它确实可以很好地编译和执行,但事件从未被触发

我试过的一些东西,可以编译,不会崩溃,但不起作用:

m_image=manage(新的Gtk::image(Gtk::Stock::APPLY,Gtk::ICON_SIZE_按钮));
m_映像->添加_事件(Gdk::所有_事件\u掩码);
m_hbox->pack_start(*m_图像,Gtk::pack_SHRINK);
m_图像->信号按钮释放事件()
.connect(sigc::hide(sigc::mem_-fun(*this,&Todo::switchStatus));
m_image->show();

#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
类赢:公共Gtk::窗口
{
公众:
赢();
布尔链接(GdkEventButton*e);
私人:
Gtk::图像;
};
Win::Win()
:图像(Gtk::Stock::APPLY,Gtk::图标\大小\按钮)
{
cerr来自:

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


因此,我想在使用eventbox包装图像后,尝试在eventbox上放置一个信号。

我喜欢在图像顶部放置一个不透明度为0的按钮。然后您可以使用它的click事件来代替。

此线程非常旧,但仍然很流行。我遇到了同样的问题,并编写了此代码,也许它可以帮助其他人我的代码只在指针悬停在图像上时检测点击

#include <gtk/gtk.h>

//compile with cc `pkg-config --cflags gtk+-3.0` text.c `pkg-config --libs gtk+-3.0` -o text

static void click_callback(GtkWidget *widget, GdkEventButton *event, gpointer );
static gboolean inRange(gint value, gint min, gint max);
static gboolean pointInRect(gint mouseX, gint mouseY, gint wx, gint wy, gint width, gint height);

GtkWidget *image;
GtkWidget *image2;

int main (int argc, char *argv[])
{
  GtkWidget *event_box;
  GtkWidget *window;
  GtkWidget *box;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);

  /* GTK_ALIGN_CENTER is necessary otherwise 
   * the callback triggers from the space on
   * the top and the bottom of the image */

  gtk_widget_set_valign(box, GTK_ALIGN_CENTER);

  image  = gtk_image_new_from_file("image1.png");
  image2 = gtk_image_new_from_file("image2.png");
  gtk_box_pack_start(GTK_BOX(box), image, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(box), image2, TRUE, FALSE, 0);

  event_box = gtk_event_box_new ();
  gtk_container_add (GTK_CONTAINER (event_box), box);

  gtk_container_add (GTK_CONTAINER (window), event_box);

  g_signal_connect(window, "destroy",
      G_CALLBACK(gtk_main_quit), NULL);

  g_signal_connect( event_box, "button_press_event", G_CALLBACK( click_callback ), image);

  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_title(GTK_WINDOW(window), "Image click event");

  gtk_widget_show_all(window);

 gtk_main();

  return 0;
}

static void click_callback(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
    GtkAllocation alloc;
    GtkAllocation alloc2;

    gtk_widget_get_allocation(image, &alloc);
    gtk_widget_get_allocation(image2, &alloc2);

    if (pointInRect(event->x, event->y, alloc.x, alloc.y, alloc.width, alloc.height))
        g_print("You clicked from image\n");

    if (pointInRect(event->x, event->y, alloc2.x, alloc2.y, alloc2.width, alloc2.height))
        g_print("You clicked from image2\n");

}

static gboolean pointInRect(gint mouseX, gint mouseY, gint wx, gint wy, gint width, gint height)
{
    return inRange(mouseX, wx, wx + width) && 
            inRange(mouseY, wy, wy + height);
}

static gboolean inRange(gint value, gint min, gint max)
{
    return (value >= min && value <= max);
}
#包括
//使用cc`pkg config--cflags gtk+-3.0`text.c`pkg config--libs gtk+-3.0`-o text编译
静态void click_回调(GtkWidget*小部件、GdkEventButton*事件、gpointer);
静态gboolean inRange(gint值、gint最小值、gint最大值);
静态gboolean pointInRect(gint-mouseX、gint-mouseY、gint-wx、gint-wy、gint-width、gint-height);
GtkWidget*图像;
GtkWidget*image2;
int main(int argc,char*argv[])
{
GtkWidget*事件箱;
GtkWidget*窗口;
GtkWidget*框;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
长方体=gtk_长方体_新(gtk_方向_水平,0);
/*GTK_对齐_中心是必要的,否则
*回调将从上的空格触发
*图像的顶部和底部*/
gtk_小部件设置有效(框,gtk_对齐_中心);
image=gtk_image_new_from_文件(“image1.png”);
image2=gtk_image_new_from_文件(“image2.png”);
gtk_-box_-pack_启动(gtk_-box(box),图像,真,假,0);
gtk_-box_-pack_启动(gtk_-box(box),图像2,真,假,0);
event_box=gtk_event_box_new();
gtk_容器添加(gtk_容器(事件框),框);
gtk_容器添加(gtk_容器(窗口)、事件框);
g_信号_连接(窗口,“销毁”,
G_回调(gtk_main_quit),NULL);
g_信号连接(事件框,“按钮按下事件”,g_回调(点击回调),图像);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_窗口设置标题(gtk_窗口(窗口),“图像点击事件”);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
静态void click_回调(GtkWidget*小部件、GdkEventButton*事件、gpointer数据)
{
Gtkalocation-alloc;
GtKalc2;
gtk_小部件_获取_分配(图像和alloc);
gtk_widget_get_分配(图像2和alloc2);
if(pointInRect(事件->x,事件->y,alloc.x,alloc.y,alloc.width,alloc.height))
g_print(“您从图像中单击的”);
if(pointInRect(事件->x,事件->y,alloc2.x,alloc2.y,alloc2.width,alloc2.height))
g_print(“您从image2中单击过”);
}
静态gboolean pointInRect(gint-mouseX、gint-mouseY、gint-wx、gint-wy、gint-width、gint-height)
{
返回范围(鼠标、宽x、宽x+宽度)和
inRange(鼠标、Y轴、Y轴+高度);
}
静态gboolean inRange(gint值、gint最小值、gint最大值)
{

return(value>=min&&value提供OP问题的其他答案,这些答案已在一段时间前发布。发布答案时,请确保添加新的解决方案或更好的解释,尤其是在回答旧问题时。