6

我有一个 GUI,它在另一个回调中使用弹出菜单中的选择。有没有办法在不创建任何临时变量的情况下仅在一行中返回弹出菜单的选定值?我尝试了几种解决方案,但我只用一个临时变量管理了两行:

三行:

list=get(handles.popupmenu1,'String');
val=get(handles.popupmenu1,'Value');
str=list{val};

两行:

temp=get(handles.popupmenu1,{'String','Value'});
str=temp{1}{temp{2}};

有人能把它剃成一个吗?

PS,这是一个动态菜单,所以我不能完全使用get(handles.popupmenu1,'Value')和忽略字符串组件。

4

3 回答 3

11

这是一个单行:

str = getCurrentPopupString(handles.popupmenu1);

这是getCurrentPopupString

function str = getCurrentPopupString(hh)
%# getCurrentPopupString returns the currently selected string in the popupmenu with handle hh

%# could test input here
if ~ishandle(hh) || strcmp(get(hh,'Type'),'popupmenu')
error('getCurrentPopupString needs a handle to a popupmenu as input')
end

%# get the string - do it the readable way
list = get(hh,'String');
val = get(hh,'Value');
if iscell(list)
   str = list{val};
else
   str = list(val,:);
end

我知道这不是您要寻找的答案,但它确实回答了您提出的问题:)

于 2010-05-03T18:01:56.567 回答
5

为了使其成为单线,我只需创建自己的函数(即getMenuSelection),就像Jonas在他的回答中说明的那样。如果你真的想要一个真正的单线,这里有一个使用CELLFUN

str = cellfun(@(a,b) a{b},{get(handles.popupmenu1,'String')},{get(handles.popupmenu1,'Value')});

非常丑陋且难以阅读。我肯定会编写自己的函数。

编辑:这里有一个稍短(但仍然同样丑陋)的使用FEVAL的单线:

str = feval(@(x) x{1}{x{2}},get(handles.popupmenu1,{'String','Value'}));
于 2010-05-03T18:08:25.433 回答
5

我知道这很愚蠢,但我无法抗拒:

list=get(handles.popupmenu1,'String'); str=list{get(handles.popupmenu1,'Value')};

我知道这不是你的意思,但就像上面的其他答案一样,它确实回答了你的问题...... :-)

于 2010-05-03T20:40:39.223 回答