Matlab事件传递给父母

时间:2012-09-21 15:04:07

标签: matlab user-interface matlab-guide

我设计了一个用户界面,我希望让某些按键在用户界面中启动某些操作。我已经尝试为图的keypressfcn回调定义一个函数,但是如果任何其他UI元素是活动元素,则调用该元素的keypressfcn(它是空的)。如何在不为UI中的所有子元素分配相同的keypressfcn函数句柄的情况下捕获整个图形的按键?

2 个答案:

答案 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

这样我的代码仍然可读。