我设计了一个用户界面,我希望让某些按键在用户界面中启动某些操作。我试着为图的keypressfcn回调函数定义一个函数,但是如果任何其他UI元素是活动元素,则调用该元素的keypressfcn(这是空的)。我怎样才能捕捉整个图形的按键,而不必为UI中的所有子元素分配相同的keypressfcn函数句柄?传递给父项的Matlab事件
3
A
回答
3
我发现WindowKeyPressFcn回调做我想要的。这是图的一个属性,但要小心,它确实如它所说 - 它捕获按键,而这是活动图形(不管活动元素是什么)。考虑一下,如果你真的想要这个,例如当一个编辑元素有焦点时,WindowKeyPressFcn会在输入时触发。
2
恐怕你得定义每一个uicontrol
的KeyPressFcn
。考虑一下:如果你设计的是Matlab,你将如何同时保持选项打开,以便用户为不同的uicontrols
分配不同的按键功能,同时还允许它们只为所有的uicontrols
使用一个主功能?
每个新的uicontrol
将必须知道你想要这样做,这相当于分配它的KeyPressFcn
。
做到这一点,最简单的方法是写一些通用的功能,像
function KeyPressFcnFwd(obj,event)
prn = get(obj, 'parent')
fcn = get(prn, 'KeyPressFcn');
fcn(prn,event);
end
,然后这样定义uicontrols:
button = uicontrol(...
'style', 'pushbutton', ...
...
'KeyPressFcn', @KeyPressFcnFwd);
做它像这样会让一些单选按钮按键呼叫它的父母的KeyPressFcn
,这是一个无线电组,然后将呼叫转发给它的母公司的KeyPressFcn
,这是一个uipanel,然后将呼叫转发给它的父母的KeyPressFcn
,最后是你的数字KeyPressFcn
。
简而言之:无论您的uicontrol
是多么深的嵌套,呼叫将始终被转发到数字。
如果定义了此功能在创建“主”图中的函数嵌套功能,你可以做到这一切有点更有效:
function main %# toplevel function
...
mainFig = figure(...) %# your main figure
...
%# nested function
function KeyPressFcnFwd(obj,event)
fcn = get(mainFig, 'KeyPressFcn');
fcn(mainFig,event);
end
...
%# Function to build the GUI
%# can be a subfunction, nested function or external function
populateMainWin(mainFig, @KeyPressFcnFwd);
...
end
,这样你就没有调用KeyPressFcn
的整棵树的开销。
在的情况下可能有很多的样板(这是一个很好的候选人),我通常定义一些速记像
function handle = uibutton(parent, text, varargin)
handle = uicontrol(...
'parent', parent, ...
'style' , 'pushbutton', ...
'units' , 'normalized', ...
'string', text, ...
'KeyPressFcn', @KeyPressFcnFwd, ...
varargin{:});
end
让我的代码保持可读。
相关问题
- 1. 将listview子项事件传递给父项
- 2. 将MouseWheel事件从子项传递给父项
- 3. 将事件传递给父视图?
- 4. 将事件传递给父节点
- 5. 将子选项卡内容中的“事件”传递给父TabActivity
- 6. 如何识别哪个事件通过nextResponder传递给父项?
- 7. 将弹出的值传递给父项
- 8. 如何将TouchUpInside事件传递给UIButton,而不将它传递给父视图?
- 9. 如何将值传递给父项tabgroupactivity?
- 10. 将事件传递给UIScrollView
- 11. Console.ReadLine()传递给C#事件
- 12. 如何将控件从子项传递给父项
- 13. 如何在Android上将视图的onClick事件传递给其父项?
- 14. 在MFC的CStatic中消耗事件并将它们传递给父项
- 15. NodeJS事件是否传递给它们的父函数?
- 16. 从用户控件中选择的传递值传递给父项
- 17. 如何将文件名传递给MATLAB?
- 18. 将触摸事件传递给父视图
- 19. 将事件从父窗口传递给iframe? (Javascript)
- 20. 在jQuery中,如何将事件传递给父锚?
- 21. 在Backbone.js中,如何阻止事件传递给父视图?
- 22. 父母抓住onTouch事件,处理它并传递给儿童
- 23. 如何将checkbox onclick事件传递给父级onclick?
- 24. 将UICollectionView触发事件传递给其父母UITableViewCell
- 25. 如何将事件传递给父视图,传递触发事件的子视图?
- 26. infernojs将数据传递给父组件
- 27. 防止父事件传播给孩子
- 28. 将自定义事件传播给父
- 29. 将颜色框中的选项传递给父项
- 30. Angular 2将数据父项传递给子组件