私は、基本OSで提供されているVala GTK + 3チュートリアルを進めています。このコードは、GTKボタンのクリックされたアクションにカスタム関数をどのように接続すればよいですか?
var button_hello = new Gtk.Button.with_label ("Click me!");
button_hello.clicked.connect (() => {
button_hello.label = "Hello World!";
button_hello.set_sensitive (false);
});
はラムダ機能を使用して、クリックするとボタンのラベルを変更することを理解しています。私がコンパイルしようとすると、コンパイル
button.clicked.connect(clicked_button(button));
しかし、私はヴァラから、このエラーを取得:私はこれを試してみた
void clicked_button(Gtk.Button sender) {
sender.label = "Clicked. Yippee!";
sender.set_sensitive(false);
}
:私は何をしたいの代わりに、この関数を呼び出している
hello-packaging.vala:16.25-16.46: error: invocation of void method not allowed as expression
button.clicked.connect(clicked_button(button));
^^^^^^^^^^^^^^^^^^^^^^
Compilation failed: 1 error(s), 0 warning(s)
私はとても優しくしてくださいヴァラとLinuxの両方に新しいです誰かが正しい方向に私を指すことができますか?
常に最初の引数として関数に渡される信号を発するインスタンスをしていますか?これはすべてのGTKウィジェットで同じですか? – Garry
はい、コールバックにはGtkCallbackの関数シグネチャが必要です。これはCではvoid(* GtkCallback)(GtkWidget * widget、gpointer data)です。 https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkCallbackおよびhttps://valadoc.org/gtk+-3.0/Gtk.Callback.htmlを参照してください。ユーザデータ部分は通常、メソッドが定義されているクラスインスタンスか、コールバックが関数名またはラムダ式として渡されたかどうかに応じてクロージャになるため、Valaでは隠されます。 – AlThomas