使用Vala的Gtk.DrawingArea鼠标事件

时间:2017-09-20 05:21:11

标签: mouseevent gtk3 vala

我一直在尝试使用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 truereturn false来检查两种情况都会发生什么。但是,当我在Gtk.DrawingArea上移动指针或单击它时,我在控制台上看不到任何消息。我甚至为顶级Gtk.Window设置了事件:

this.set_events (this.get_events() |
                 Gdk.EventMask.ENTER_NOTIFY_MASK |
                 Gdk.EventMask.BUTTON_PRESS_MASK);

但事件似乎没有收到。可能出现什么问题?

1 个答案:

答案 0 :(得分:2)

您的代码似乎是正确的,尽管它不是MVCE。我会指出回调处理程序原型是不正确的,但由于你不使用事件数据,它不应该是一个"问题"。 enter_notify_eventbutton_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进行编译。

结果是:

result

Fedora 23 上使用 Vala 0.30.2 Gtk + 3.18