2013-05-03 47 views
1

我试图找出为什么我的代码输出“1”,从静态的主要功能和从Gtk.Button后续调用一些明显的随机值第一次调用。我的信号处理程序有什么问题?

gtkdream.vala:

using GLib; 
using Gtk; 

public class Main : Object { 
    public int pc = 1; 

    public Main() { 
     var builder = new Builder(); 
     builder.add_from_file ("gtkdream.ui"); 
     builder.connect_signals (this); 
     var window = builder.get_object ("window") as Window; 
     window.show_all(); 
    } 

    public void step_clicked() { 
     stderr.printf("%d\n", pc);   
    } 

    static int main (string[] args) { 
     Gtk.init (ref args); 
     var app = new Main(); 
     app.step_clicked(); 
     Gtk.main(); 
     return 0; 
    } 
} 

gtkdream.ui:

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkWindow" id="window"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <property name="title" translatable="yes">window</property> 
    <property name="window_position">center</property> 
    <property name="default_width">500</property> 
    <property name="default_height">400</property> 
    <child> 
     <object class="GtkButton" id="step"> 
     <property name="use_action_appearance">False</property> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="use_action_appearance">False</property> 
     <property name="label" translatable="yes">Schritt ausführen</property> 
     <property name="use_underline">True</property> 
     <signal name="clicked" handler="main_step_clicked" swapped="no"/> 
     </object> 
    </child> 
    </object> 
</interface> 

我使用这个命令行编译:

valac gtkdream.vala --pkg gtk+-3.0 --pkg gmodule-2.0 

一些错误信号连接?

回答

3

Vala无法为自动通过GtkBuilder连接的回调提供类型安全性,因此您必须小心提供正确的定义。请参阅Vala wiki上的GTK +示例的Loading User Interface from XML File部分。具体而言,这一部分:

注意:当使用Gtk.Builder的信号自动连接功能,所有的处理程序必须将其相应的信号的全部特征,包括信号发送器作为第一个参数。否则,您将在运行时发生分段错误。

那么你的方法应该是:

public void step_clicked (Gtk.Button button) { 
    stderr.printf("%d\n", pc);   
} 

可以使按钮参数为空的,如果你想使你仍然可以通过传递null调用它的main()。

然而,该实例仍然是放错了地方,因为在该链接还解释:

如果你想在回调方法是实例方法,而不是静态的方法,你必须与注释它们[CCode(instance_pos = -1)]属性并将实例传递给connect_signals(...)而不是null:

您正在将实例传递给connect_signals,但是您缺少CCode注释。所以,真的是你想要的是:

[CCode (instance_pos = -1)] 
public void step_clicked (Gtk.Button button) { 
    stderr.printf("%d\n", pc);   
} 
+0

这就是我从不耐烦......我只是呼吁从主要出于绝望,但良好的方法来知道按钮参数可以是可空搞定。 – 2013-05-04 07:56:23