2017-04-03 14 views
1

저는 Elementary 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) 

저는 Vala와 Linux에 익숙하지 않으므로 친절하게 대해주십시오. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

답변

4

함수의 결과가 아닌 함수에 대한 참조를 전달해야합니다. 그래서되어야합니다 : 버튼을 클릭하면

button.clicked.connect (clicked_button);

은 GTK +는 인수로 버튼으로 clicked_button 함수를 호출합니다.

invocation of void method not allowed as expression은 메서드를 호출하는 (호출하는) 오류 메시지가 표시되며 결과가 없습니다 (void). 함수 이름 끝에 괄호 (())를 추가하면 해당 함수가 호출됩니다.

+0

신호를 내보내는 인스턴스가 항상 첫 번째 인수로 함수에 전달됩니까? 이것은 모든 GTK 위젯에 대해 동일합니까? – Garry

+0

예, C에서 void (* GtkCallback) (GtkWidget * widget, gpointer data) 인 GtkCallback의 함수 시그니처가 콜백에 있어야합니다. https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkCallback 및 https://valadoc.org/gtk+-3.0/Gtk.Callback.html을 참조하십시오. 사용자 데이터 부분은 메서드가 정의 된 클래스 인스턴스이거나 콜백이 함수 이름 또는 람다 식으로 전달되었는지 여부에 따라 닫히기 때문에 일반적으로 Vala에서 숨겨집니다. – AlThomas

0

관리가 제대로 작동합니다. 다른 사람들이 필요로 할 경우을 대비해 다음 코드가 있습니다.

int main(string[] args) { 
    // Initialise GTK 
    Gtk.init(ref args); 

    // Configure our window 
    var window = new Gtk.Window(); 
    window.set_default_size(350, 70); 
    window.title = "Hello Packaging App"; 
    window.set_position(Gtk.WindowPosition.CENTER); 
    window.set_border_width(12); 
    window.destroy.connect(Gtk.main_quit); 

    // Create our button 
    var button = new Gtk.Button.with_label("Click Me!"); 
    button.clicked.connect(clicked_button); 

    // Add the button to the window 
    window.add(button); 
    window.show_all(); 

    // Start the main application loop 
    Gtk.main(); 
    return 0; 
} 

// Handled the clicking of the button 
void clicked_button(Gtk.Button sender) { 
    sender.label = "Clicked. Yippee!"; 
    sender.set_sensitive(false); 
}