2012-09-21 41 views
3

我设计了一个用户界面,我希望让某些按键在用户界面中启动某些操作。我试着为图的keypressfcn回调函数定义一个函数,但是如果任何其他UI元素是活动元素,则调用该元素的keypressfcn(这是空的)。我怎样才能捕捉整个图形的按键,而不必为UI中的所有子元素分配相同的keypressfcn函数句柄?传递给父项的Matlab事件

回答

3

我发现WindowKeyPressFcn回调做我想要的。这是图的一个属性,但要小心,它确实如它所说 - 它捕获按键,而这是活动图形(不管活动元素是什么)。考虑一下,如果你真的想要这个,例如当一个编辑元素有焦点时,WindowKeyPressFcn会在输入时触发。

2

恐怕你得定义每一个uicontrolKeyPressFcn。考虑一下:如果你设计的是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 

让我的代码保持可读。

相关问题