我设计了一个用户界面,我希望让某些按键在用户界面中启动某些操作。我已经尝试为图的keypressfcn回调定义一个函数,但是如果任何其他UI元素是活动元素,则调用该元素的keypressfcn(它是空的)。如何在不为UI中的所有子元素分配相同的keypressfcn函数句柄的情况下捕获整个图形的按键?
答案 0 :(得分:3)
我发现WindowKeyPressFcn回调做了我想要的。这是图的属性,但要注意,它完全按照它所说的 - 它捕获按键,而这是活动图(无论活动元素是什么)。考虑一下你是否真的想要这个,例如当一个编辑元素有焦点时,WindowKeyPressFcn会在键入时触发。
答案 1 :(得分:2)
我担心你必须定义每一个uicontrol
的{{1}}。想一想:如果你设计了Matlab,你会如何同时保持选项打开,让用户为不同的KeyPressFcn
分配不同的按键功能,同时也允许他们只为所有{{1}使用一个主功能}?
每个新的uicontrols
都必须知道您要这样做,这等于分配uicontrols
。
最简单的方法是编写一些通用函数,如
uicontrol
然后像这样定义uicontrol:
KeyPressFcn
这样做可以让一些单选按钮上的按键调用其父节点function KeyPressFcnFwd(obj,event)
prn = get(obj, 'parent')
fcn = get(prn, 'KeyPressFcn');
fcn(prn,event);
end
,这是一个广播组,然后将呼叫转发给其父节点button = uicontrol(...
'style', 'pushbutton', ...
...
'KeyPressFcn', @KeyPressFcnFwd);
,这是一个uipanel,然后将调用转发给其父级KeyPressFcn
,这最后是你的数字KeyPressFcn
。
简而言之:无论您的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
这样我的代码仍然可读。