2013-04-20 34 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