c – 按下按钮时,Gtkmm scroll_event不起作用
作者:互联网
我有一个连接了两个事件的Gtk :: EventBox:button_press_event和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;
}
解决方法:
您显示的示例代码有两个问题.
>首先,你说“我有一个连接了两个事件的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.
标签:gtkmm,c,events,gtk,signals 来源: https://codeday.me/bug/20190825/1722403.html