【问题标题】:Matlab control+enter key on figure图上的matlab control+enter键
【发布时间】:2015-09-19 23:01:35
【问题描述】:

我想在用户按住控制键并在图形窗口上按下回车键时进行捕捉。注意:这是编辑器中“评估当前部分”的默认键。

参见下面的示例代码:

function test
  f = figure;  
  f.KeyPressFcn = @myKeyPressFcn;
end
function myKeyPressFcn ( hFig, event )
  cm = hFig.CurrentModifier();  
  if ~isempty ( cm )
    fprintf ( 'CurrentKey: %s:%s\n', cm{1}, hFig.CurrentKey );
  else 
    fprintf ( 'CurrentKey: %s\n', hFig.CurrentKey );
  end
end

要重现将上述内容保存在编辑器中的活动文件中并运行该功能 - 需要打开编辑器(这很重要!!)。

当图形处于活动状态时,按任意键 -> 所选键被写入终端窗口。但是,如果您按住 Control 并按 enter(return)键,那么这不会被捕获,而是 Matlab 会尝试在编辑器中“评估当前部分”(或以前称为的单元格)(无论图中是否有重点)。这当然会抛出错误......

我已联系 Matlab 支持,这是“预期行为!”。我可以(几乎)明白为什么它可能是演示的好主意 - 但对于在 Matlab 中运行的专业应用程序,我个人认为这个“功能”是一个错误!

注意事项

  1. 当编辑器关闭时,图中捕获到 control+enter
  2. 在已部署的应用程序中,会捕获 control+enter。
  3. 如果我手动更改 Evaluate Current Section 快捷方式,则会捕获 control+enter。

我已经尝试了很多方法来解决这个问题,但都没有奏效,例如隐藏编辑器或将编辑器启用状态设置为 false(这些都不是可接受的解决方案 - 我试图看看我可以做什么一个小测试用例...):

function test
  desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
  jEditor = desktop.getGroupContainer('Editor').getTopLevelAncestor;
  jEditor.setVisible(false);
  jEditor.setEnable(false);
  f = figure
  f.KeyPressFcn = @myKeyPressFcn;
  uiwait(f);
  jEditor.setVisible(true);
  jEditor.setEnable(true);
end

我可以让它工作的唯一方法是在启动 GUI 时关闭所有编辑器文件,然后在 GUI 关闭时再次打开它们(这不是一个可接受的解决方案...... - 原因相当明显!! )

我确实考虑过尝试临时修改“评估当前部分”的快捷键(Preferences-Keyboard-Shortcuts) -> 但还没有找到从命令行执行此操作的方法,然后将其设置回来完成后再次。如果速度很快,您可以在用户按下并释放控制键时执行此操作。

那我在问什么:

如果可能的话,我需要一个适用于任何地方的任何人的解决方案 - 就好像我可以让它工作一样,它将包含在 my Matlab GUI Toolbox 的一个新附加功能中。 - 世界各地的人们都在使用它。

  1. 您知道如何从命令行修改键盘快捷键吗?如果知道的话!
  2. 还有其他建议吗?
  3. 我的另一个想法是将我的快捷键更改为不同的组合键 - 但其中的乐趣在哪里! :)(如果某处的某个用户将执行当前单元格更改为我的新组合,我仍然会遇到问题......)

附言感谢您阅读这篇文章! :)

【问题讨论】:

  • 在我看来,这在较新的 MATLAB 版本中已修复。 (在 MATLAB 2016b、Ubuntu 16.04 上测试)
  • 刚刚在 R2019a、Win10 上测试过。它不会“评估单元格”,但也不会触发“输入”键的事件。

标签: matlab keyboard keyboard-shortcuts enter


【解决方案1】:

你为什么不去home> Preferences > keyboard > Shortcut那里换呢?

您只需要在页面顶部的黑框中点击Ctrl + Enter 即可搜索相关命令,即此处的 Evaluate Current Section 并根据需要更改它。

请记住,您只需要拆分窗口(取消停靠)。然后,当你点击Ctrl + Enter 时,它会做任何你想做的事。

希望这个答案对您有所帮助。

【讨论】:

  • 感谢您的回复,但是我需要一个可以独立为任何(和许多)用户工作的解决方案 - 因为这将是我在问题中提到的 GUI 工具箱的一部分。我不会要求工具箱的用户手动更改这样的常用快捷方式,只是为了使用工具箱的特定功能。一个可能的解决方案是暂时覆盖它并重新设置它(问题底部列表中的第 1 点)
【解决方案2】:

您可以从我的FEX 提交中尝试解决方案。 KbTimer 的动机是需要捕获键盘敲击而不需要 GUIDE 或 APP DESIGNER 设计的 GUI。请注意,函数的实现灵感来自基于 MEX 的 PsychToolbox。

【讨论】:

  • 感谢您的建议,我要在这里添加的功能我改变了方向,但如果我再试一次,我会考虑它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多