Je travaille sur le didacticiel Vala GTK + 3 fourni par Elementary OS. Je comprends que ce code:Comment connecter une fonction personnalisée à l'action cliquée d'un bouton 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);
});
utilise une fonction Lambda pour changer l'étiquette du bouton lorsqu'il est cliqué. Ce que je veux faire est d'appeler cette fonction à la place:
void clicked_button(Gtk.Button sender) {
sender.label = "Clicked. Yippee!";
sender.set_sensitive(false);
}
J'ai essayé ceci:
button.clicked.connect(clicked_button(button));
Mais je reçois cette erreur de la compilation Vala lorsque je tente de compiler:
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)
Je suis nouveau à la fois Vala et Linux alors s'il vous plaît soyez doux, mais quelqu'un peut me diriger dans la bonne direction?
L'instance qui émet le signal est-elle toujours transmise à la fonction en tant que premier argument? Est-ce la même chose pour tous les widgets GTK? – Garry
Oui, car le rappel doit avoir une signature de fonction de GtkCallback, qui en C est vide (* GtkCallback) (widget GtkWidget *, données gpointer); Voir https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkCallback et https://valadoc.org/gtk+-3.0/Gtk.Callback.html. La partie de données utilisateur est généralement masquée dans Vala car il s'agit de l'instance de classe où la méthode est définie ou de la fermeture, selon que le rappel a été passé en tant que nom de fonction ou expression lambda. – AlThomas