2013-03-29 4 views
1

Я боролся со следующим кодом. Мой обработчик сигнала on_button_press_event() никогда не вызывается, но я понятия не имею, почему. Может ли кто-нибудь взглянуть на него? Возможно, кто-то может запустить через gtkmm lib с информацией об отладке. У меня есть только предварительно установленные пакеты gtkmm, которые нельзя было использовать для отладки в самой библиотеке.обработчик сигнала переопределения в gtkmm

#include <iostream> 

    using namespace std; 

    #include <gtkmm.h> 
    #include <goocanvasmm.h> 

    bool MyExternalHandler(const Glib::RefPtr<Goocanvas::Item>& item, GdkEventButton* ev) 
    { 
     cout << "External Handler" << endl; 
     return false; 
    } 

    class MyRect : public Goocanvas::Rect 
    { 
     public: 
      MyRect(double x, double y, double w, double h) 
       //: Goocanvas::Rect(x,y,w,h) 
     { 
      property_x()=x; 
      property_y()=y; 
      property_width()=w; 
      property_height()=h; 
     } 

     public: 
      virtual void nonsens() {} 

      bool on_button_press_event(const Glib::RefPtr<Item>& target, GdkEventButton* event) override 
      { 
       cout << "override handler" << endl; 
       return false; 
      } 

      bool Handler(const Glib::RefPtr<Goocanvas::Item>& item, GdkEventButton* ev) 
      { 
       cout << "via mem_fun" << endl; 
       return false; 
      } 

      bool on_enter_notify_event(const Glib::RefPtr<Item>& target, GdkEventCrossing* event) override 
      { 
       cout << "override enter notify" << endl; 
       return false; 
      } 
    }; 


    int main(int argc, char* argv[]) 
    { 
     Gtk::Main app(&argc, &argv); 
     Goocanvas::init("example", "0.1", argc, argv); 
     Gtk::Window win; 
     Goocanvas::Canvas m_canvas; 
     m_canvas.set_size_request(640, 480); 
     m_canvas.set_bounds(0, 0, 1000, 1000); 


     MyRect* ptr; 
     Glib::RefPtr<MyRect> m_rect_own(ptr=new MyRect(225, 225, 150, 150)); 
     m_rect_own->property_line_width() = 1.0; 
     m_rect_own->property_stroke_color() = "black"; 
     m_rect_own->property_fill_color_rgba() = 0x555555ff;  

     Glib::RefPtr<Goocanvas::Item> root = m_canvas.get_root_item(); 
     root->add_child(m_rect_own); 

     ((Glib::RefPtr<Goocanvas::Item>&)m_rect_own)->signal_button_press_event().connect(sigc::ptr_fun(&MyExternalHandler)); 
     ((Glib::RefPtr<Goocanvas::Item>&)m_rect_own)->signal_button_press_event().connect(sigc::mem_fun(*ptr, &MyRect::Handler)); 

     win.add(m_canvas); 

     win.show_all_children(); 

     Gtk::Main::run(win); 
     return 0; 
    } 

ответ

-1

Ваш on_button_press_event() метод не является переопределение, поскольку она имеет неправильные параметры: https://developer.gnome.org/gtkmm/unstable/classGtk_1_1Widget.html#aba72b7f8655d1a0eb1273a26894584e3

+0

просто не компилируется, если я меняю на подпись к 'виртуальной BOOL \t on_button_press_event (GdkEventButton * button_event) 'потому что переопределение не выполняется. – Klaus

+0

К сожалению, ваша подпись верна для GooCanvas :: item. Это действительно не Gtk :: Widget. – murrayc

Смежные вопросы