2017-09-20 25 views
0

Vala를 사용하여 Gtk.DrawingArea에서 마우스 이벤트를 받으려고했지만 성공하지 못했습니다. 특히 나는 Gtk.DrawingArea을 하위 클래스라는거야 내 생성자에서 나는 이벤트가 내가 받고 싶은 추가Vala를 사용하는 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); 

하지만 이벤트가 수신 얻을하지 않는 것. 무엇이 잘못 될 수 있습니까?

답변

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

페도 23에 발라 0.30.2 및 GTK + 3.18 사용.