LINUX.ORG.RU

gtkmm. Проблема с срабатыванием сигнала signal_button_press_event()


0

1

Использую библиотеку 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;
}

Это связанно с проследовательностью обработки событий. Попробуйте такой вариант:

[code=cpp] pButton->signal_button_press_event().connect(sigc::ptr_fun(&on_button_press_event), true); [/code]

anonymous ()

libglade устарела, ее сейчас не используют. Ну и другие сигналы(привязанные к кнопкам работают? Если нет — стоит попробовать при компиляции добавить флаг -export-dynamic .

CrossFire ★★★★★ ()
Ответ на: комментарий от anonymous

попробовал false - не работает :( ни для кнопки, ни для холста

g-71 ()

По-умолчанию, Gtk не обрабатывает клики, нужно задавать event mask явно. Это должно помочь: add_events(Gdk::EventMask(GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK ));

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.