0

我有一个包含单选按钮和滑块的问题。我的目的是:当滑块的值发生变化时,必须重新运行该时刻选中的单选按钮中的代码才能刷新效果。

te 滑块的最大值、最小值和步长在打开函数中定义,当前值定义为handles.value

这是我的滑块代码。

function slider1_Callback(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

handles.svalue = get(handles.slider1, 'Value');

guidata(hObject, handles)

这是我的单选按钮组选择更改代码。

function uipanel3_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in uipanel3 
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)
switch get(eventdata.NewValue,'Tag') % Get Tag of selected object.
    case 'hte'
        h_te = zeros(handles.rows, handles.colums);

        for m = handles.row_0:handles.rows
            gauss = fspecial('gaussian',[1 round(1+handles.svalue*(m-handles.row_0+1))], (0.3*round(1+handles.svalue*(m-handles.row_0+1))));
            h_te(m,:,1) = filter2(gauss, handles.img_d(m,:,1));
            h_te(m,:,2) = filter2(gauss, handles.img_d(m,:,2));
            h_te(m,:,3) = filter2(gauss, handles.img_d(m,:,3));
            h_te(handles.rows-m+1,:,1) = filter2(gauss, handles.img_d(handles.rows-m+1,:,1));
            h_te(handles.rows-m+1,:,2) = filter2(gauss, handles.img_d(handles.rows-m+1,:,2));
            h_te(handles.rows-m+1,:,3) = filter2(gauss, handles.img_d(handles.rows-m+1,:,3));
        end

        axes(handles.axes2);
        imshow(h_te);

    case 'hc'
        h_c = zeros(handles.rows, handles.colums);

        for m = handles.row_0:handles.rows
            gauss = fspecial('gaussian',[1 round(1+handles.svalue*(m-handles.row_0+1))], (0.3*round(1+handles.svalue*(m-handles.row_0+1))));
            h_c(m-handles.row_0+1,:,1) = filter2(gauss, handles.img_d(m-handles.row_0+1,:,1));
            h_c(m-handles.row_0+1,:,2) = filter2(gauss, handles.img_d(m-handles.row_0+1,:,2));
            h_c(m-handles.row_0+1,:,3) = filter2(gauss, handles.img_d(m-handles.row_0+1,:,3));
            h_c(handles.rows-m+handles.row_0,:,1) = filter2(gauss, handles.img_d(handles.rows-m+handles.row_0,:,1));
            h_c(handles.rows-m+handles.row_0,:,2) = filter2(gauss, handles.img_d(handles.rows-m+handles.row_0,:,2));
            h_c(handles.rows-m+handles.row_0,:,3) = filter2(gauss, handles.img_d(handles.rows-m+handles.row_0,:,3));
        end

        axes(handles.axes2);
        imshow(h_c);

    case 'vlr'
        v_lr = zeros(handles.rows, handles.colums);

        for m = handles.colum_0:handles.colums
            gauss = fspecial('gaussian',[round(1+handles.svalue*(m-handles.colum_0+1)) 1], (0.3*round(1+handles.svalue*(m-handles.colum_0+1))));
            v_lr(:,m,1) = filter2(gauss, handles.img_d(:,m,1));
            v_lr(:,m,2) = filter2(gauss, handles.img_d(:,m,2));
            v_lr(:,m,3) = filter2(gauss, handles.img_d(:,m,3));
            v_lr(:,handles.colums-m+1,1) = filter2(gauss, handles.img_d(:,handles.colums-m+1,1));
            v_lr(:,handles.colums-m+1,2) = filter2(gauss, handles.img_d(:,handles.colums-m+1,2));
            v_lr(:,handles.colums-m+1,3) = filter2(gauss, handles.img_d(:,handles.colums-m+1,3));
        end

        axes(handles.axes2);
        imshow(v_lr);

    case 'vc'
        v_c = zeros(handles.rows, handles.colums);

        for m = handles.colum_0:handles.colums
            gauss = fspecial('gaussian',[round(1+handles.svalue*(m-handles.colum_0+1)) 1], (0.3*round(1+handles.svalue*(m-handles.colum_0+1))));
            v_c(:,m-handles.colum_0+1,1) = filter2(gauss, handles.img_d(:,m-handles.colum_0+1,1));
            v_c(:,m-handles.colum_0+1,2) = filter2(gauss, handles.img_d(:,m-handles.colum_0+1,2));
            v_c(:,m-handles.colum_0+1,3) = filter2(gauss, handles.img_d(:,m-handles.colum_0+1,3));
            v_c(:,handles.colums-m+handles.colum_0,1) = filter2(gauss, handles.img_d(:,handles.colums-m+handles.colum_0,1));
            v_c(:,handles.colums-m+handles.colum_0,2) = filter2(gauss, handles.img_d(:,handles.colums-m+handles.colum_0,2));
            v_c(:,handles.colums-m+handles.colum_0,3) = filter2(gauss, handles.img_d(:,handles.colums-m+handles.colum_0,3));
        end

        axes(handles.axes2);
        imshow(v_c);

end
guidata(hObject, handles)

我认为在滑块中调用 uipanel3 函数可以工作,但它没有。这就是我认为可行的方法。

function slider1_Callback(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

handles.svalue = get(handles.slider1, 'Value');

uipanel3_SelectionChangeFcn(hObject, eventdata, handles);

guidata(hObject, handles)
4

1 回答 1

1

它不起作用,因为 hObject 和 eventdata 用于滑块,而不是用于按钮组,因此 eventdata 不包含您要查找的字段。您可以手动生成带有必填字段的事件数据,尽管这有点小技巧,而且 Oldvalue 并不是它应该的样子......

尝试

eventdata_new.EventName = 'SelectionChanged';
eventdata_new.OldValue = get(handles.uipanel3,'SelectedObject');
eventdata_new.NewValue = get(handles.uipanel3,'SelectedObject');

uipanel3_SelectionChangeFcn(handles.uipanel3, eventdata_new, handles);

代替

uipanel3_SelectionChangeFcn(hObject, eventdata, handles);
于 2012-12-28T20:14:50.373 回答