我的Matlab GUI中有一个奇怪的问题。GUI包含uipanel
和icontrol
对象,其中一些对象是按钮。通常,GUI由方向箭头键控制。
但是,一旦我单击其中一个按钮,键盘事件就不再被记录。我在按键回调中设置了断点,以了解发生了什么,结果发现回调从未被调用。如果我设法点击GUI后台,它会再次工作,这让我认为它与活动控件有关。但是我怎样才能将控制权交还给主窗口呢?uicontrol(hFigure)
不起作用,figure(hFigure)
也不起作用。
以下代码片段再现了该问题。将它复制到一个新文件中(理想情况下称为test.m
,否则代码分析器会抱怨),并运行它来打开一个显示这种行为的GUI窗口。单击按钮后,除非用户单击text uicontrol
之外的区域,否则不会再记录箭头键。
function test
figure('KeyPressFcn',@key)
clf
p = uipanel('position',[0 0 1 1],'BackgroundColor',[.7 .7 .7]);
uicontrol('Style','push','String','Click me','Units','norm',...
'Position',[0.43 0.91 0.14 0.06],'Callback',@button);
t = uicontrol(p,'Style','text','String','Use arrow keys','Units','norm',...
'Position',[0.2 0.4 0.6 0.2],'FontSize',20);
function button(~,~)
set(t,'String','Button pressed.');
end
function key(~,e)
set(t,'String',['Key ' e.Key ' pressed.']);
end
end
您说得对为什么这不起作用。当您单击按钮时,图形不再是活动控件。解决此问题的最佳方法是将按钮的KeyPressFcn
属性额外设置为与图中的KeyPressFcn
相同
function test
figure('KeyPressFcn',@key)
clf
p = uipanel('position',[0 0 1 1],'BackgroundColor',[.7 .7 .7]);
uicontrol('Style','push','String','Click me','Units','norm',...
'Position',[0.43 0.91 0.14 0.06],'Callback',@button, ...
'KeyPressFcn', @key);
t = uicontrol(p,'Style','text','String','Use arrow keys','Units','norm',...
'Position',[0.2 0.4 0.6 0.2],'FontSize',20);
function button(~,~)
set(t,'String','Button pressed.');
end
function key(~,e)
set(t,'String',['Key ' e.Key ' pressed.']);
end
end
您也可以设置WindowKeyPressFcn
而不是KeyPressFcn
有关更多信息,请参阅此处的答案:
matlab:KeyPressFcn和WindowKeyPressFcn之间的差异