2012-09-21 47 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 

讓我的代碼保持可讀。

相關問題