เหตุการณ์เมาส์ Gtk. DrawingArea โดยใช้ Vala

ฉันพยายามรับกิจกรรมเมาส์บน Gtk.DrawingArea ของฉันโดยใช้ Vala แต่ไม่ประสบผลสำเร็จ โดยเฉพาะฉันกำลังจัดคลาสย่อย Gtk.DrawingArea และในตัวสร้างของฉัน ฉันเพิ่มเหตุการณ์ที่ฉันต้องการรับ:

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

จากนั้น ใน Constructor เดียวกันด้านล่าง ฉันจะลงทะเบียนตัวจัดการสัญญาณสำหรับเหตุการณ์เหล่านี้:

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

แต่ดูเหมือนเหตุการณ์จะไม่ได้รับ จะเกิดอะไรขึ้น?


person John bracciano    schedule 20.09.2017    source แหล่งที่มา


คำตอบ (1)


ดูเหมือนว่าโค้ดของคุณถูกต้องแม้ว่าจะไม่ใช่ 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

ผลลัพธ์คือ:

ผลลัพธ์

ใช้ Vala 0.30.2 และ Gtk+ 3.18 บน Fedora 23

person José Fonte    schedule 20.09.2017