2017-04-03 3 views
1

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?

Répondre

4

Vous devez passer une référence à la fonction, plutôt que le résultat de la fonction. Il doit donc être:

button.clicked.connect (clicked_button);

Lorsque le bouton est cliqué GTK + invoqueront la fonction clicked_button avec le bouton comme un argument.

Le message d'erreur invocation of void method not allowed as expression vous indique que vous appelez (invoquant) la méthode et qu'il n'y a pas de résultat (void). L'ajout de parenthèses, (), à la fin d'un nom de fonction appelle cette fonction.

+0

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

+0

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

0

Géré pour que cela fonctionne. Voici le code dans d'autres cas de besoin:

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); 
}