MATLAB中的GUI弹出式菜单

3
我有一个弹出菜单,其中包含5、10、15、20个内容。我使用switch创建了这个菜单。
val=get(hobject,'value');
switch val
    case '5'
        n=5;
    case '10'
        n=10;
    case '15'
        n=15;
    case '20'
        n=20;
end
guidata(hObject, handles);

这里的“n”代表输出图像数量。在同一GUI窗口中按下搜索按钮时,它会调用另一个函数,在该函数中我需要使用这个“n”。

for i = 1:n          % Store top n matches...
    tempstr = char(resultNames(index(i)));
    fprintf(fid, '%s\r', tempstr);
    disp(resultNames(index(i)));
    disp(sortedValues(i));
    disp('  ')
end

如何将这个'n'传递给那个代码或函数?任何合适的答案都会受到赞赏。
2个回答

2

首先,你的switch语句是不正确的,也是不必要的。下拉菜单的Value属性不是当前选择中包含的文本,而是其列表中当前选择的索引。要获取当前选择的列表项的字符串值,你可以这样做:

contents = cellstr(get(hObject,'String')) % returns contents as cell array
contents{get(hObject,'Value')} % returns value of selected item from dropdown

当然,这是假定hObject是指向下拉框的句柄 - 只有在由下拉框本身引发的回调中才会是这样。此外,请注意,无需通过离散化的switch语句转换字符串值;您可以直接使用str2numstr2double函数。
最后,如果您需要从下拉框的回调之外访问它的值,则需要使用传递到每个回调的handles结构(或在您的示例中从guidata返回的结构)。在handles中将有与您的下拉框同名的字段 - 这将是您可以访问其属性的句柄。

要调用的函数是独立的函数,与使用 handles 的 GUI 窗口函数没有任何关系。 - Chethan
好的,但是在搜索按钮回调函数中,您可以访问handles,因此您可以在回调函数中获取n的值,并将其作为参数传递给您的单独函数。 - wakjah
是的,我考虑将它作为参数传递,但同一函数在执行期间被多次调用会产生任何影响吗?我需要的确切是,如果用户在菜单中选择了“10”,那么在我的for循环中,“n”应该被赋值为“10”。这样输出将是10张图片。 - Chethan
除非在循环进行时值 n 改变,你不应该会遇到问题。即使这样,如果你的搜索按钮回调调用单个带有参数 n 的函数,并在其中执行循环,则当 GUI 在函数执行时无法更改 n 的值。我真的不知道问题出在哪里... - wakjah
新的问题是,要调用的函数中有太多的调用函数。它反复调用函数,所以在将n作为参数传递后,我得到了一个错误。`??? Undefined variable "handles" or class "handles.queryx".Error in ==> color at 14 D = quadratic(handles.queryx, handles.querymap, X, HSVmap);Error in ==> Search_window>Search_Callback at 109 color(n);` - Chethan
请将此作为一个新问题,以避免混乱。 - wakjah

1
传递GUI信息的方法是使用handles结构。如果您使用GUIDE创建GUI,则应在打开函数中创建handles。您可以修改打开函数以添加字段和初始值到handles。例如,您可以将以下内容添加到打开函数中:
handles.n = 1; % This initializes handles.n to a default value in case the search button is 
                % pushed before an item in the menu is selected. 

请在菜单的回调函数中包含以下内容,以更新并存储n的值:
handles.n = val; % This is updated every time an item from the menu is selected.  
guidata(hObject,handles); 

在搜索按钮的回调函数中,您可以访问n的值并将其传递给其他函数,如下所示:
n = handles.n;
myFunction(n);

你的其他函数应该以类似以下方式开始:
function [] = myFunction(n)

接着包括在上面的代码之后。您需要确保myFunction.m在Matlab搜索路径中(可以使用addpath设置,或者通过单击Matlab中的设置路径按钮进行设置)。


要调用的函数是独立的函数,与使用 handles 的 GUI 窗口函数没有任何关系。上面提到的代码 for i = 1:n % Store top n matches... 在函数外部,不在 GUI 窗口函数中。 - Chethan
抱歉,我不明白handles.n = 1;会做什么。我需要的是,如果用户在菜单中选择了“10”,那么在我的for循环中,“n”应该被赋值为“10”。是的,我考虑过将其作为参数传递,但同一函数在执行期间被多次调用,这会产生任何影响吗?因此输出将是10张图片。 - Chethan
这将实现你想要的功能。handles.n = 1 初始化该字段。菜单回调每次更新为用户选择的值。然后,您必须向您的函数传递一个参数。如果菜单回调已经更新了 handles.n,则您的函数将具有不同的输入。 - Molly
抱歉,再问一遍,开头的函数是哪个? - Chethan
如果您使用GUIDE创建了GUI,则会有一个名为name_OpeningFunction的函数,其中name是您为GUI命名的名称。 - Molly
新问题,要调用的函数里面有太多的调用函数。在传入n作为参数后,它会反复调用这些函数,所以我得到了一个错误。错误信息:未定义变量“handles”或类“handles.queryx”。位置:第14行D = quadratic(handles.queryx, handles.querymap, X, HSVmap);位置:搜索窗口>搜索回调函数,在第109行color(n); - Chethan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接