2017-03-15 4 views
1

Donc, je viens de commencer à utiliser SFGUI dans mon projet SFML et j'ai du mal à comprendre comment tout fonctionne. J'ai lu le tutoriel hello world et quelques-uns des exemples que la bibliothèque elle-même propose dans ses dossiers.Essayer de lier un simple bouton à une fonction OnClick dans SFGUI

J'essaie maintenant de créer un simple bouton qui fait quelque chose quand il détecte un clic gauche, mais je n'arrive même pas à le faire fonctionner correctement. La fenêtre des erreurs indique que la variable button n'est pas définie dans ma méthode OnClick, et si j'essaie d'envoyer button en utilisant les paramètres de std::bind, j'obtiens le type "aucune fonction correspondante pour ...".

Dans la plupart des exemples de la bibliothèque, ce problème est résolu en utilisant this comme deuxième paramètre, à côté du nom de la fonction, mais cela ne semble pas fonctionner pour moi.

Comment cela devrait-il être fait?

Mon code:

void pressEnter(){ 
    button->SetLabel("Tocado"); // FIRST ERROR IN THIS LINE 
} 

int main(){ 

    sfg::SFGUI sfgui; 

    sf::VideoMode video_mode(800, 600); 
    sf::RenderWindow rwindow(video_mode, "In-joked - Menu Principal"); 
    sf::Event event; 

    auto button = sfg::Button::Create("Status"); 
    button->GetSignal(sfg::Button::OnLeftClick).Connect(
      std::bind(&pressEnter, button)); //SECOND ERROR IN THIS LINE 

    ... 
} 

L'erreur NetBeans montre pour la première ligne: « « « Impossible de résoudre l'identificateur » bouton bouton » n'a pas été déclaré dans ce champ »

Et pour la deuxième ligne:

« dans le fichier inclus de

erreur: aucune fonction de mise en correspondance pour l'appel à « SFG :: signal :: Connect (std :: _ Bind_helper 0 Std :: bind (& pressEnter, bouton));

erreur en pleine sortie de la console d'exécution:

main.cpp: In function ‘void pressEnter()’: 
main.cpp:7:5: error: ‘button’ was not declared in this scope 
    button->SetLabel("Tocado"); 
    ^
In file included from /usr/include/c++/5/memory:79:0, 
       from /usr/local/include/SFGUI/Signal.hpp:6, 
       from /usr/local/include/SFGUI/Object.hpp:4, 
       from /usr/local/include/SFGUI/Adjustment.hpp:3, 
       from /usr/local/include/SFGUI/Widgets.hpp:6, 
       from main.cpp:2: 
/usr/include/c++/5/functional: In instantiation of ‘struct std::_Bind_check_arity<void (*)(), std::shared_ptr<sfg::Button>&>’: 
/usr/include/c++/5/functional:1439:12: required from ‘struct std::_Bind_helper<false, void (*)(), std::shared_ptr<sfg::Button>&>’ 
/usr/include/c++/5/functional:1462:5: required by substitution of ‘template<class _Func, class ... _BoundArgs> typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type std::bind(_Func&&, _BoundArgs&& ...) [with _Func = void (*)(); _BoundArgs = {std::shared_ptr<sfg::Button>&}]’ 
main.cpp:20:42: required from here 
/usr/include/c++/5/functional:1410:7: error: static assertion failed: Wrong number of arguments for function 
     static_assert(sizeof...(_BoundArgs) == sizeof...(_Args), 
    ^
main.cpp: In function ‘int main()’: 
main.cpp:20:43: error: no matching function for call to ‘sfg::Signal::Connect(std::_Bind_helper<false, void (*)(), std::shared_ptr<sfg::Button>&>::type)’ 
      std::bind(&pressEnter, button)); 
             ^
In file included from /usr/local/include/SFGUI/Object.hpp:4:0, 
       from /usr/local/include/SFGUI/Adjustment.hpp:3, 
       from /usr/local/include/SFGUI/Widgets.hpp:6, 
       from main.cpp:2: 
/usr/local/include/SFGUI/Signal.hpp:40:16: note: candidate: unsigned int sfg::Signal::Connect(std::function<void()>) 
    unsigned int Connect(std::function<void()> delegate); 
       ^
/usr/local/include/SFGUI/Signal.hpp:40:16: note: no known conversion for argument 1 from ‘std::_Bind_helper<false, void (*)(), std::shared_ptr<sfg::Button>&>::type {aka std::_Bind<void (*(std::shared_ptr<sfg::Button>))()>}’ to ‘std::function<void()>’ 
nbproject/Makefile-Debug.mk:78: recipe for target 'build/Debug/GNU-Linux/main.o' failed 
make[2]: *** [build/Debug/GNU-Linux/main.o] Error 1 
make[2]: Leaving directory '/home/manu/NetBeansProjects/GameMenu' 
nbproject/Makefile-Debug.mk:59: recipe for target '.build-conf' failed 
make[1]: *** [.build-conf] Error 2 
make[1]: Leaving directory '/home/manu/NetBeansProjects/GameMenu' 
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed 
make: *** [.build-impl] Error 2 

BUILD FAILED (exit value 2, total time: 953ms) 
+0

Vous dites 'std :: bind' pour passer la variable' button' comme argument à la fonction 'pressEnter' quand elle est appelée. Et pourtant, votre fonction ne prend aucun argument. –

+0

Je sais bien? La première chose que j'ai essayée a été de régler 'pressEnter' pour recevoir un paramètre, parce que cela semblait étrange, mais cela n'a pas fonctionné. De plus, les tutoriels le gardent comme ça. – Manu

+1

Si vous avez des erreurs, commencez par montrer le code qui donne des erreurs. Ensuite, incluez également les erreurs réelles que vous obtenez, en entier, complètes avec des notes d'information possibles, et non modifiées. S'il vous plaît prenez le temps de [lire sur la façon de poser de bonnes questions] (http://stackoverflow.com/help/how-to-ask). –

Répondre

1

Un choix serait d'avoir votre variable dans un champ où les deux peuvent y accéder.

sfg::Button::Ptr button; 

void pressEnter(){ 
    button->SetLabel("Tocado"); 
} 

int main(){ 

    sfg::SFGUI sfgui; 

    sf::VideoMode video_mode(800, 600); 
    sf::RenderWindow rwindow(video_mode, "In-joked - Menu Principal"); 
    sf::Event event; 

    button = sfg::Button::Create("Status"); 
    button->GetSignal(sfg::Button::OnLeftClick).Connect(&pressEnter); 

    ... 
} 

Ceci est une variable globale et probablement pas la meilleure façon de le faire, mais cela fonctionnera. Comment structurer votre programme pour ne pas avoir de variables globales est un peu trop large pour un Q & A ici.