无法在 wxPerl 中EVT_KEY_DOWN触发



在这种情况下,$selfWx::Frame的子类,我可以向框架添加控件,菜单等。 但是我无法添加关键事件。 我正在使用以下内容来添加密钥事件:

  EVT_KEY_DOWN($self,  &_process_char);

_process_char函数如下所示:

sub _process_char {
   my ($evt) = @_;
   warn 'key pressed';
}

事件不会触发。 我做错了什么? 如何让按键关闭事件与 wxperl 一起使用?

它与事件传播有关 - textctrl 处理 keydown/keyup 事件,而默认的 textctrl 处理程序(默认的 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
  • 处理来自 wxFrame 上的 wxTextCtrl 的事件 - C++/wxWidgets
  • wxWidgets 讨论论坛 • 查看主题 - 无法在 wxPanel 中捕获EVT_KEY_DOWN或EVT_CHAR
  • 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 );

相关内容

  • 没有找到相关文章