Обнаружить клик по Gtk :: Image? - PullRequest
4 голосов
/ 04 июля 2011

Я пытался обнаружить клики на Gtk::Image с помощью gtkmm более 2 часов, но не смог заставить его работать.Он прекрасно компилируется и выполняет исключительную ситуацию, но событие никогда не срабатывает.

Некоторые вещи, которые я пробовал, которые компилируются, не дают сбой, но не работают:

m_image = manage(new Gtk::Image(Gtk::Stock::APPLY, Gtk::ICON_SIZE_BUTTON));
m_image->add_events(Gdk::ALL_EVENTS_MASK); 
m_hbox->pack_start(*m_image, Gtk::PACK_SHRINK);

m_image->signal_button_release_event()
    .connect(sigc::hide(sigc::mem_fun(*this, &Todo::switchStatus)));

m_image->show();

или

#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <gtkmm/button.h>
#include <gtkmm/stock.h>
#include <gtkmm/image.h>

#include <iostream>

using namespace std;

class Win : public Gtk::Window
{
    public:
        Win();
        bool link(GdkEventButton* e);

    private:
        Gtk::Image image;
};

Win::Win()
    : image(Gtk::Stock::APPLY, Gtk::ICON_SIZE_BUTTON)
{
    cerr << "created" << endl;

    image.add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
    image.signal_button_release_event().connect(sigc::mem_fun(*this, &Win::link));
    image.show();

    add(image);
}

bool Win::link(GdkEventButton* e)
{
    cerr << "kuh" << endl;
}

int main(int argc, char *argv[])
{
    Gtk::Main   app(argc, argv);

    Gtk::Window window;
    window.resize(300, 500);

    Win win;

    Gtk::Main::run(win);

    return 0;
}

Ну, я не знаю, что еще я могу доу… Есть идеи?:)

Заранее спасибо.

1 Ответ

5 голосов
/ 04 июля 2011

С http://developer.gnome.org/gtkmm/unstable/classGtk_1_1Image.html:

Gtk :: Image является виджетом "без окна" (не имеет собственного Gdk :: Window), поэтому по умолчанию не получает события. Если вы хотите получать события на изображении, такие как нажатия кнопок, поместите изображение в Gtk :: EventBox, затем подключитесь к сигналам событий в окне событий

Итак, я думаю, попробуйте поместить сигнал в поле событий после обертывания изображения с помощью EventBox.

...