2013-04-20 81 views
3

我有一個Gtk :: EventBox,它連接了兩個事件:button_press_event和scroll_event。 所有這兩個事件工作正常,但是當我按住鼠標按鈕時,不會發出滾動事件。當按下按鈕時,Gtkmm scroll_event不起作用

我在我的班級實施了bool on_button_press_event (GdkEventButton *e)bool on_scroll_event (GdkEventScroll *e)這兩個功能。這兩個函數返回false以進一步傳播事件。

即時通訊使用gtkmm3。

我該如何解決這個問題?

的代碼示例來重現問題:

#include <gtkmm.h> 
#include <iostream> 

class MyWindow : public Gtk::Window 
{ 
    Gtk::EventBox event_box; 
    Gtk::ScrolledWindow scrolled; 
public: 
    bool on_button_press_event(GdkEventButton *b) 
    { 
    std::cout << "button press" << std::endl; 
    return false; 
    } 

    bool on_scroll_event(GdkEventScroll *e) 
    { 
    std::cout << "scrollEvent" << std::endl; 
    return false; 
    } 

    MyWindow() 
    { 
    add(scrolled); 
    scrolled.add(event_box); 
    set_default_size(640, 480); 
    show_all(); 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Gtk::Main kit(argc, argv); 
    MyWindow window; 
    kit.run(window); 
    return 0; 
} 

回答

3

您顯示的示例代碼有兩個問題。

  • 首先,你說:「我有一個Gtk :: EventBox連接了兩個事件。但在你的例子中,你連接到MyWindow的事件,並保持EventBox的事件不連接。

  • 一個EventBox允許你接收事件,但你仍然必須明確地說你想接收哪個事件。

這是糾正代碼:

#include <gtkmm.h> 
#include <iostream> 

class MyWindow : public Gtk::Window 
{ 
    Gtk::EventBox event_box; 

    bool event_box_button_press(GdkEventButton *b) 
    { 
    std::cout << "button press" << std::endl; 
    return false; 
    } 

    bool event_box_scroll(GdkEventScroll *e) 
    { 
    std::cout << "scrollEvent" << std::endl; 
    return false; 
    } 

public: 
    MyWindow() 
    { 
    event_box.add_events(Gdk::BUTTON_MOTION_MASK); 
    event_box.add_events(Gdk::SCROLL_MASK); 

    event_box.signal_button_press_event().connect(
     sigc::mem_fun(*this, &MyWindow::event_box_button_press)); 
    event_box.signal_scroll_event().connect(
     sigc::mem_fun(*this, &MyWindow::event_box_scroll)); 

    add(event_box); 

    set_default_size(640, 480); 
    show_all(); 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Gtk::Main kit(argc, argv); 
    MyWindow window; 
    kit.run(window); 
    return 0; 
} 

這個代碼的一些注意事項:

  • 我省略了ScrolledWindow,因爲這是無關的例子。你不需要它來捕捉滾動事件。如果您確實需要應用程序的滾動窗口,則可以將其添加回來。

  • 如果您使用所需行爲派生自定義EventBox,代碼可能會更整潔。我沒有這樣做,以保持接近你的原始代碼。

  • 有關連接信號和sigc::mem_fun材料的信息,請參閱this documentation

3

它看起來像在Windows上,scrolledWindow是觀看滾動事件,而不是主窗口中的正確的地方。

使用下面的修改,我能夠處理Windows 7

#include <gtkmm.h> 
#include <iostream> 

class MyScrolledWindow : public Gtk::ScrolledWindow 
{ 
public: 
    bool on_scroll_event(GdkEventScroll *e) 
    { 
    std::cout << "scrollEvent" << std::endl; 
    return false; 
    } 

    MyScrolledWindow() 
    { 
    } 
}; 

class MyWindow : public Gtk::Window 
{ 
    Gtk::EventBox event_box; 
    MyScrolledWindow scrolled; 
public: 
    bool on_button_press_event(GdkEventButton *b) 
    { 
    std::cout << "button press" << std::endl; 
    return false; 
    } 

    MyWindow() 
    { 
    add(scrolled); 
    scrolled.add(event_box); 
    set_default_size(640, 480); 
    show_all(); 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Gtk::Main kit(argc, argv); 
    MyWindow window; 
    kit.run(window); 
    return 0; 
} 

======老答滾動事件:============== ==

我無法重現您的isse。這是我曾經嘗試重現您的問題代碼:

#include <gtkmm.h> 
#include <iostream> 

class MyEventBox : public Gtk::EventBox 
{ 
    bool on_button_press_event(GdkEventButton *b) 
    { 
    std::cout << "button press" << std::endl; 

    return false; 
    } 

    bool on_scroll_event(GdkEventScroll *e) 
    { 
    std::cout << "scrollEvent" << std::endl; 

    return false; 
    } 
}; 


int main(int argc, char** argv) 
{ 
    Gtk::Main kit(argc, argv); 
    Gtk::Window window; 
    MyEventBox eventBox; 

    eventBox.show(); 
    window.add(eventBox); 

    kit.run(window); 

    return 0; 
} 

對於編譯,我用(使用Linux)如下因素的命令行:

g++ main.cpp $(pkg-config --cflags --libs gtkmm-3.0)

  • 如果你能重現你使用這個最小示例問題,問題可能是平臺特定的,並且可能需要使用窗口/事件框「Gdk::Window」的解決方法。
  • 如果您無法使用此代碼重現您的問題,則問題會在您的代碼中的其他位置引起,您需要發佈更多信息。
+0

對不起,我不只是添加到您的原帖評論,但我沒有足夠的聲譽這樣做 – 2013-04-27 12:51:28

+0

在哪些操作系統是你能夠重現問題了嗎? – 2013-04-27 14:40:58

+0

好吧,我已經用示例代碼更新了問題以重現問題。我將在Linux/Debian下進行測試。 – Pioz 2013-04-27 15:10:44