Использую библиотеку gtkmm. Возникла проблема с реакцией на событие button_press_event - её попросту нет.
событие перерисовки холста expose_event() нормально работает
pDrawingArea->signal_expose_event().connect(sigc::ptr_fun(&on_DrawingArea_Expose));
а вот button_press_event абсолютно не вызывается: ни у button ни drawingarea
pDrawingArea->signal_expose_event().connect(sigc::ptr_fun(&on_DrawingArea_Expose));
...
pButton->signal_button_press_event().connect(sigc::ptr_fun(&on_button_press_event));
Гуглил по этой теме, никаких конкретных ответов нет. Кто-то пишет, что это баг gtkmm
вот код
#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <libglade-2.0/glade/glade-xml.h>
#include <gtkmm-2.4/gtkmm/builder.h>
#include <gtkmm-2.4/gtkmm/drawingarea.h>
#include <gtkmm-2.4/gtkmm/button.h>
bool on_button_press_event(GdkEventButton* event)
{
g_print("on_button_press_event");
return true;
}
void on_clicked()
{
g_print("Click!");
}
bool on_DrawingArea_Click(GdkEventButton* event)
{
g_print("Click on DrawingArea\n");
return true;
}
bool on_DrawingArea_Expose(GdkEventExpose* event)
{
g_print("on_DrawingArea_Expose\n");
return true;
}
int main (int argc, char* argv[])
{
Gtk::Main kit(argc, argv);
Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create();
try
{
refBuilder->add_from_file("mainwindow.glade");
}
catch(...)
{
g_print("No");
}
Gtk::Window* pWindow = 0;
refBuilder->get_widget("window1", pWindow);
if (pWindow)
{
Gtk::DrawingArea* pDrawingArea = 0;
refBuilder->get_widget("drawingarea1", pDrawingArea);
pDrawingArea->signal_button_press_event().connect(sigc::ptr_fun(&on_DrawingArea_Click));
pDrawingArea->signal_expose_event().connect(sigc::ptr_fun(&on_DrawingArea_Expose));
Gtk::Button* pButton = 0;
refBuilder->get_widget("button1", pButton);
pButton->signal_clicked().connect(sigc::ptr_fun(on_clicked));
pButton->signal_button_press_event().connect(sigc::ptr_fun(&on_button_press_event));
Gtk::Main::run(*pWindow);
}
return 0;
}