【问题标题】:How can i use VALA delegates in GTK3 button callback?如何在 GTK3 按钮回调中使用 VLA 委托?
【发布时间】:2016-03-06 04:42:14
【问题描述】:

我正在尝试用 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' andtypeDelegate' 不支持算术运算 button.clicked.connect+=cb;

【问题讨论】:

    标签: delegates gtk3 vala


    【解决方案1】:

    嗯,

    似乎您想获取包含发出信号的实例的内在变量,我觉得奇怪的是 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多