Не удается заставить EVT_KEY_DOWN срабатывать в wxPerl
В этом случае $self
это подкласс Wx::Frame
и я могу добавить элементы управления, меню и т. д. в рамку. Однако я не могу добавить ключевые события. Я использую следующее, чтобы добавить ключевое событие:
EVT_KEY_DOWN($self, \&_process_char);
Функция _process_char выглядит так:
sub _process_char {
my ($evt) = @_;
warn 'key pressed';
}
Событие не сработало. Что я делаю неправильно? Как заставить события key down работать с wxperl?
1 ответ
Это связано с распространением событий - textctrl обрабатывает события keydown / keyup, а по умолчанию (обработчик textctrl по умолчанию) эти события не передаются до кадра. Если вы хотите, чтобы ваш обработчик вызывался, связывайтесь с wxTheApp() или textctrl. Вот пример, где не все ключи распространяются
#!/usr/bin/perl --
use strict; use warnings;
use Wx ();
Main( @ARGV );
exit( 0 );
sub Main {
local $| = 1;
my $app = Wx::SimpleApp->new;
my $frame = Wx::Frame->new( undef, -1, "type stuff ", ([250,150])x2 );
my $text = Wx::TextCtrl->new( $frame, -1,"", );
$app->SetTopWindow( $frame );
my $target = @_ ? $frame : $text;
Wx::Event::EVT_KEY_DOWN( $target , \&Frobnicate );
Wx::Event::EVT_KILL_FOCUS($app, sub{ Wx::wxTheApp()->ExitMainLoop });
$app->{counter} = 0;
$frame->Show;
$text->SetFocus;
$app->MainLoop;
}
sub Frobnicate {
my( $widget, $kev )=@_;
my $app = Wx::wxTheApp();
my $count = $app->{counter}++;
my $frame = $app->GetTopWindow;
my $title = $frame->GetTitle;
$title =~ s{\d*+$}{$count};
$frame->SetTitle( $title );
$kev->Skip if 0 == $count % 4; ## sometimes :P
}
- http://docs.wxwidgets.org/trunk/overview_events.html
- http://docs.wxwidgets.org/trunk/classwx_key_event.html
- Обработка событий из wxTextCtrl на wxFrame - C++/wxWidgets
- Дискуссионный форум wxWidgets • Просмотр темы - невозможно поймать EVT_KEY_DOWN или EVT_CHAR в wxPanel
- http://wiki.wxwidgets.org/Catching_key_events_globally
Кроме того, вы вызываете свой обработчик _process_char, но используете EVT_KEY_DOWN - есть EVT_CHAR только для символов:)
Обновление: для примера ноутбука замените (в приведенном выше примере) $text
с
my $noteb = Wx::Notebook->new( $frame );
my $text = Wx::TextCtrl->new( $noteb, -1,"", );
$noteb->AddPage( $text, "you myst type stuff");
Wx::Event::EVT_KEY_DOWN( $app, \&Frobnicate );