我一直在尝试使用Vala在Gtk.DrawingArea
上接收鼠标事件,但没有成功。具体来说,我是子类Gtk.DrawingArea
,在我的构造函数中,我添加了我想要接收的事件:
this.add_events (Gdk.EventMask.ENTER_NOTIFY_MASK |
Gdk.EventMask.BUTTON_PRESS_MASK);
然后,在下面的相同构造函数中,我为这些事件注册信号处理程序:
this.enter_notify_event.connect (
(page, event) => {
stdout.printf("mouse entered !!! \n");
return true;
}
);
this.button_press_event.connect (
(page, event) => {
stdout.printf("mouse click \n");
return false;
}
);
我尝试了return true
和return false
来检查两种情况都会发生什么。但是,当我在Gtk.DrawingArea
上移动指针或单击它时,我在控制台上看不到任何消息。我甚至为顶级Gtk.Window
设置了事件:
this.set_events (this.get_events() |
Gdk.EventMask.ENTER_NOTIFY_MASK |
Gdk.EventMask.BUTTON_PRESS_MASK);
但事件似乎没有收到。可能出现什么问题?
答案 0 :(得分:2)
您的代码似乎是正确的,尽管它不是MVCE。我会指出回调处理程序原型是不正确的,但由于你不使用事件数据,它不应该是一个"问题"。 enter_notify_event
和button_press_event
的回调原型仅提供事件,因此页面参数不正确。
无论如何,我使用非常简单的原始代码进行测试并且它有效。请验证:
using Gtk;
public class MyWidget : Gtk.DrawingArea {
public MyWidget () {
this.set_events (Gdk.EventMask.ENTER_NOTIFY_MASK |
Gdk.EventMask.BUTTON_PRESS_MASK);
this.enter_notify_event.connect ((event) => {
stdout.printf ("mouse entered !!! \n");
return false;
});
this.button_press_event.connect ((event) => {
stdout.printf("mouse click \n");
return false;
});
}
}
public void main (string[] args) {
Gtk.init (ref args);
var window = new Gtk.Window ();
window.add (new MyWidget ());
window.destroy.connect (Gtk.main_quit);
window.show_all ();
Gtk.main ();
}
使用valac test.vala --pgk gtk+-3.0
进行编译。
结果是:
在 Fedora 23 上使用 Vala 0.30.2 和 Gtk + 3.18 。