Acara mouse Gtk.DrawingArea menggunakan Vala

Saya telah mencoba menerima acara mouse di Gtk.DrawingArea saya, menggunakan Vala, tetapi tidak berhasil. Secara khusus saya membuat sub-kelas Gtk.DrawingArea dan di konstruktor saya, saya menambahkan acara yang ingin saya terima:

this.add_events (Gdk.EventMask.ENTER_NOTIFY_MASK |
                 Gdk.EventMask.BUTTON_PRESS_MASK);

Kemudian, di konstruktor yang sama di bawah ini, saya mendaftarkan penangan sinyal untuk kejadian berikut:

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;
        }
);

Saya mencoba return true dan return false untuk memeriksa apa yang terjadi dalam kedua kasus tersebut. Namun saya tidak melihat pesan di konsol ketika saya memindahkan penunjuk ke Gtk.DrawingArea atau ketika saya mengkliknya. Saya bahkan mengatur acara untuk Gtk.Window teratas:

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

tapi acaranya sepertinya tidak diterima. Apa yang salah?


person John bracciano    schedule 20.09.2017    source sumber


Jawaban (1)


Kode Anda tampaknya benar meskipun bukan MVCE. Saya akan menunjukkan prototipe penangan panggilan balik sebagai salah tetapi karena Anda tidak menggunakan data peristiwa, itu seharusnya tidak menjadi "masalah". Prototipe panggilan balik untuk enter_notify_event dan button_press_eventhanya menyediakan acara tersebut, jadi argumen halamannya salah.

Bagaimanapun, saya menguji dengan kode yang sangat sederhana dan mentah dan berhasil. Harap verifikasi:

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 ();
}

Kompilasi dengan valac test.vala --pgk gtk+-3.0.

Hasilnya adalah:

hasil

Menggunakan Vala 0.30.2 dan Gtk+ 3.18 di Fedora 23.

person José Fonte    schedule 20.09.2017