저는 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에 익숙하지 않으므로 친절하게 대해주십시오. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?
신호를 내보내는 인스턴스가 항상 첫 번째 인수로 함수에 전달됩니까? 이것은 모든 GTK 위젯에 대해 동일합니까? – Garry
예, 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