Попытка привязать простую кнопку к функции OnClick в SFGUI

Итак, я только начал использовать SFGUI в своем проекте SFML, и я изо всех сил пытаюсь понять, как все работает. Я читал учебник hello world и некоторые примеры, которые сама библиотека предлагает в своих папках.

Сейчас я пытаюсь создать простую кнопку, которая что-то делает, когда обнаруживает левый щелчок, но я даже не могу заставить это работать должным образом. Окно ошибок говорит button переменная не определена в моем OnClick метод, и если я попытаюсь отправить button используя параметры std::bind Я получаю типичную функцию «нет соответствия для …».

В большинстве примеров библиотеки эта проблема решается с помощью this в качестве второго параметра, рядом с именем функции, но это, похоже, не работает для меня.

Как это должно быть сделано?

Мой код:

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

...
}

Ошибка NetBeans показывает для первой строки:
«Невозможно разрешить идентификатор» кнопка «.» Кнопка «не была объявлена ​​в этой области»

И для второй строки:

«в файле из

ошибка: нет подходящей функции для вызова call sfg :: Signal :: Connect (std :: _ Bind_helper&> :: тип)»
станд :: Bind (&нажмите Enter, кнопку)); «

Полная ошибка в выводе консоли запуска:

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)

1

Решение

Одним из вариантов будет иметь вашу переменную в области видимости, где оба могут получить к ней доступ.

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

...
}

Это глобальная переменная и, вероятно, не лучший способ сделать это, но она будет работать. Как структурировать вашу программу так, чтобы она не имела глобальных переменных, слишком много для Q&А здесь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]