GTKMM: Как прикрепить события клавиатуры к DrawingArea? - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно присоединить событие клавиатуры к моему Canvas, которое наследуется от DrawingArea.

Я уже добавил эти события в add_events () в своем конструкторе, но после запуска ключевое событие не отвечает, что не так?

Canvas::Canvas()
:m_dragDataRequestedForDrop(false), m_dropItem(nullptr),m_flag(false)
{
    add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | 
        Gdk::POINTER_MOTION_MASK | Gdk::KEY_PRESS_MASK | 
        Gdk::KEY_RELEASE_MASK);

    set_app_paintable();
    this->set_can_focus(true);
    this->signal_key_press_event().connect(sigc::mem_fun(*this, 
        &Canvas::onDeleteKeyPress));
}


bool Canvas::onDeleteKeyPress(GdkEventKey *p_event)
{
    bool m_eventHandlerFlag = false;

    if (p_event->type == GDK_KEY_PRESS && p_event->keyval == GDK_KEY_Delete)
    {
        m_eventHandlerFlag = true;
    }
    if(m_eventHandlerFlag)
    {
        std::cout << "Holi DEL" << "\n";
        //removeActiveElements();
    }
    std::cout << "Key pressed: " << p_event->hardware_keycode
        << "\n";
    return false;
}

Спасибо за помощь

1 Ответ

0 голосов
/ 23 декабря 2018

Вы должны поместить GtkDrawArea в GtkEventBox, а затем делать все это из GtkEventBox. Насколько я помню, это происходит потому, что для GtkDrawArea нет этих событий. Это объяснил один из стековых потоков, но только с GtkImage. Я знаю, что GtkDrawArea в GtkEventBox работает, потому что в настоящее время я пишу приложение, которое использует его (приложение находится в c, но оно должно работать и для c ++).

...