特定のキーを押すと、ユーザー インターフェイスで何らかのアクションが開始されるように設計したユーザー インターフェイスがあります。Figure の keypressfcn コールバックの関数を定義しようとしましたが、他の UI 要素がアクティブな要素である場合、その要素の keypressfcn が呼び出されます (これは空です)。UI 内のすべての子要素に同じ keypressfcn 関数ハンドルを割り当てずに、図全体のキー押下をキャプチャするにはどうすればよいですか?
2 に答える
WindowKeyPressFcn コールバックが私が望むことを行うことがわかりました。これは Figure のプロパティですが、注意してください、それはまさにその通りに動作します - これがアクティブな Figure である間 (アクティブな要素が何であるかに関係なく)、キー押下をキャプチャします。これが本当に必要かどうかを検討してください。たとえば、編集要素にフォーカスがある場合、入力時に WindowKeyPressFcn が起動します。
残念ながら、すべてuicontrol
のを定義する必要がありますKeyPressFcn
。uicontrols
考えてみてください: もしあなたが Matlab を設計したとしたら、ユーザーがすべての に対して 1 つのマスター機能のみを使用できるようにしながら、異なる に対して異なるキープレス機能を割り当てるオプションを同時に開いたままにしておくにはどうすればよいでしょう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
と、ラジオ グループである親の が呼び出され、親の である uipanel に呼び出しが転送され、親のであるuipanelKeyPressFcn
に呼び出しが転送されます。あなたのフィギュアの。KeyPressFcn
KeyPressFcn
要するに、あなたがどれほど深くネストされていてuicontrol
も、呼び出しは常に Figure までずっと転送されます。
「メイン」図が作成される関数でこの関数をネストされた関数として定義すると、すべてをより効率的に実行できます。
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
私のコードが読みやすいままになるように。