拦截wxTextCtrl中的加速键

时间:2017-05-21 17:03:30

标签: wxpython wxwidgets

我有一个包含多个项目的菜单,所有项目都使用制表符字符便利方法定义加速器快捷方式。像这样:

Increase volume\tCtrl+Up

到目前为止一切顺利。但是,我的两个加速器分别使用快捷键Ctrl + Left和Ctrl + Right。我的问题是,当专注于TextCtrl时,这些快捷方式已经有了预期的功能 - 在文本字段中,Ctrl + Left和Ctrl + Right应该按字导航。我的大多数用户都会大量使用键盘,因此关键是这些功能可以按预期工作。

到目前为止,我已经研究过,通过绑定wxEVT_CHAR_HOOK的处理程序,我可以在处理加速器使用之前拦截所有密钥。但我不太确定如何从那一点开始。我想定义一组应该传递给TextCtrl的快捷方式,但如果没有TextCtrl特定的功能,则允许其他加速器正常处理。例如,Ctrl + Left和Ctrl + Right应由TextCtrl处理,因为它们按字导航,但Ctrl + O应触发其相关的菜单命令,因为TextCtrl对该特定快捷方式没有用处。

更改快捷方式(例如更改为Alt + Left而不是Ctrl + Left)不是一个选项,因为应用程序允许用户以交互方式更改加速器。当TextCtrl具有焦点时禁用有问题的菜单项也将无法工作,因为相关的加速器快捷方式仍然无法在TextCtrl中执行其预期的功能(即,使用加速器Ctrl + Left禁用菜单项不会神奇地使TextCtrl进程正确组合键组合)。后一点似乎是wx中的一个错误,但事实就是如此。

1 个答案:

答案 0 :(得分:1)

如果您在Windows下遇到此问题,请覆盖wxWindow::MSWShouldPreProcessMessage()并为相关的组合键返回false应该修复它。然而,这是一个仅限C ++的解决方案,我不知道即使wxPhoenix提供了一种从Python覆盖虚拟方法的方法(而且几乎可以肯定经典的wxPython没有)。

可以说,wxTextCtrl::MSWShouldPreProcessMessage()中的库版本应该已经这样做了,所以也许你可以自己修改wxWidgets(并提交一个包含更改的补丁,而不必自己维护它们。)