2017-09-20 11 views
0

私はGtk.DrawingAreaでマウスイベントを受信しようとしていますが、Valaを使用すると成功しません。具体的に私は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

のFedora 23にヴァラ0.30.2のGtk + 3.18を使用します。

関連する問題