Как подключить таймер wxWidgets к событию, используя wxEvtHandler :: Connect - PullRequest
4 голосов
/ 09 июня 2011

Я пытался подключить свой таймер к функции.В моем производном классе я делаю

Timer->SetOwner(this,wxID_Timer);
Timer->Connect(wxID_Timer,wxTimerEventHandler( Window::OnUpdate ), NULL, this );

Где мое объявление OnUpdate

void OnUpdate( wxTimerEvent& event );

Может кто-нибудь сказать мне, что здесь не так, почему OnUpdate не вызывается периодическипосле запуска таймера?Пожалуйста и спасибо.

Также я не использую статические таблицы событий. Другой ответ на wxTimer мне не помогает.

Ответы [ 3 ]

6 голосов
/ 17 июня 2011

После небольшого поиска я действительно нашел ответ, никто не отвечает, поэтому я публикую его здесь.Было несколько вещей, которые я делал неправильно.я.Я действительно должен был подключить класс к моему таймеру.Это означало, что я должен был сделать что-то вроде

this->Connect(Timer.GetId(),wxEVT_TIMER,wxTimerEventHandler( Window::OnUpdate ), NULL, this );

Где wxEVT_TIMER был типом события.

Аналогично, чтобы отключить

this->Disconnect(wxID_Timer,wxEVT_TIMER,wxTimerEventHandler( Window::OnUpdate ), NULL, this );
4 голосов
/ 25 августа 2012

Кажется, здесь какая-то путаница, поэтому позвольте мне попытаться ее очистить.

Вы можете либо вызвать timer->Connect(...) на самом таймере или использовать SetOwner(frame) и затем frame->Connect(...).

Вызов SetOwner(), а затем вызов Connect() по таймеру не имеет особого смысла, поскольку SetOwner() гарантирует, что событие таймера будет доставлено непосредственно владельцу. Однако по умолчанию владелец отсутствует, и таймер отправляет события самому себе, поэтому без вызова SetOwner() необходимо вызвать Connect() для таймера.

3 голосов
/ 23 августа 2012

Ответ у меня не сработал. Это то, что я сделал вместо этого.

Сначала вы должны позволить вашему фрейму иметь события, которые испускает wxtimer.

m_timer.SetOwner( this );

Тогда вы можете иметь обработчик событий вашего фрейма для обработки событий. Если у вас есть только один таймер, используйте это.

this->Connect( wxEVT_TIMER, wxTimerEventHandler( Frame::OnTimer ), NULL, this );

Если у вас несколько таймеров, используйте это для подключения события каждого таймера к другой функции.

this->Connect( m_timer.GetId(), wxEVT_TIMER, wxTimerEventHandler( Frame::OnTimerForSpecificTimer ), NULL, this );

Выполнение этого позволит фрейму поместить событие таймера в свою очередь событий и обработать его, когда сможет.

...