我如何在 GTK3 按钮回调中使用 VALA 委托?
How can i use VALA delegates in GTK3 button callback?
我正在尝试用 Gtk3 理解 Vala 委托。
我测试回调和 lambda 没有问题。
我想测试委托回调,这里是我的代码:
using Gtk;
delegate void typeDelegate(Button button);
int main (string[] args) {
Gtk.init (ref args);
typeDelegate cb = cbLabelf;
var window = new Window ();
window.title = "First GTK+ Program";
window.border_width = 10;
window.window_position = WindowPosition.CENTER;
window.set_default_size (350, 70);
window.destroy.connect (Gtk.main_quit);
var button = new Button.with_label ("Click me!");
//button.clicked.connect (cb);
//button.clicked+= cb;
button.clicked.connect+=cb;
window.add (button);
window.show_all ();
Gtk.main ();
return 0;
}
void cbLabelf(Button button)
{
button.label = "tank yu";
}
我还红色生成了 C 代码(当我使用 lambda 时)来理解。
这里的编译错误:
GTKsampleDelegate.vala:20.5-20.30: 错误:类型 Gtk.Button.clicked.connect' and
typeDelegate 不支持算术运算'
button.clicked.connect+=cb;
嗯,
你似乎想要获取保存发出信号的实例的内部变量,我觉得很奇怪,vala 不允许你使用委托变量通过参数获取它,但是,你可以使用其中之一以下形式:不使用委托变量 (A) 或使用闭包绕过错误 (B)。
public class FooSignalClass : Object {
/* Gtk Button.clicked signal has the void f(void) signature */
public signal void on_foo ();
public void foo() {
on_foo();
}
}
public delegate void FooSignalFunc (FooSignalClass fooer);
void on_foo_handler (FooSignalClass fooer) {
long fooer_memory_address = (long)fooer;
GLib.message(@"fooer exists? $(fooer!=null).");
GLib.message(@"address=$fooer_memory_address.");
}
int main () {
var foo_signal = new FooSignalClass();
long fooer_memory_address = (long)foo_signal;
GLib.message(@"foo_signal address=$fooer_memory_address.");
/* Option A: Connect directly without the delegate variable */
foo_signal.on_foo.connect(on_foo_handler);
/* Option B: You cant use a delegate directly, bypass it with a closure */
FooSignalFunc func = on_foo_handler;
foo_signal.on_foo.connect((instance) => {
func(instance);
});
foo_signal.foo();
return 0;
}
我正在尝试用 Gtk3 理解 Vala 委托。 我测试回调和 lambda 没有问题。 我想测试委托回调,这里是我的代码:
using Gtk;
delegate void typeDelegate(Button button);
int main (string[] args) {
Gtk.init (ref args);
typeDelegate cb = cbLabelf;
var window = new Window ();
window.title = "First GTK+ Program";
window.border_width = 10;
window.window_position = WindowPosition.CENTER;
window.set_default_size (350, 70);
window.destroy.connect (Gtk.main_quit);
var button = new Button.with_label ("Click me!");
//button.clicked.connect (cb);
//button.clicked+= cb;
button.clicked.connect+=cb;
window.add (button);
window.show_all ();
Gtk.main ();
return 0;
}
void cbLabelf(Button button)
{
button.label = "tank yu";
}
我还红色生成了 C 代码(当我使用 lambda 时)来理解。
这里的编译错误:
GTKsampleDelegate.vala:20.5-20.30: 错误:类型 Gtk.Button.clicked.connect' and
typeDelegate 不支持算术运算'
button.clicked.connect+=cb;
嗯,
你似乎想要获取保存发出信号的实例的内部变量,我觉得很奇怪,vala 不允许你使用委托变量通过参数获取它,但是,你可以使用其中之一以下形式:不使用委托变量 (A) 或使用闭包绕过错误 (B)。
public class FooSignalClass : Object {
/* Gtk Button.clicked signal has the void f(void) signature */
public signal void on_foo ();
public void foo() {
on_foo();
}
}
public delegate void FooSignalFunc (FooSignalClass fooer);
void on_foo_handler (FooSignalClass fooer) {
long fooer_memory_address = (long)fooer;
GLib.message(@"fooer exists? $(fooer!=null).");
GLib.message(@"address=$fooer_memory_address.");
}
int main () {
var foo_signal = new FooSignalClass();
long fooer_memory_address = (long)foo_signal;
GLib.message(@"foo_signal address=$fooer_memory_address.");
/* Option A: Connect directly without the delegate variable */
foo_signal.on_foo.connect(on_foo_handler);
/* Option B: You cant use a delegate directly, bypass it with a closure */
FooSignalFunc func = on_foo_handler;
foo_signal.on_foo.connect((instance) => {
func(instance);
});
foo_signal.foo();
return 0;
}