2013-05-03 66 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