Change the Value of MATLAB uicontrols Programmatically does NOT call the ValueChangedFcn Callback

May. 25, 2023

今天在调试MATLAB GUI程序时发现了一个关于ValueChangedFcn回调函数的调用特性:使用代码修改UI控件时并不会调用控件的ValueChangedFcn回调函数

创建一个uidropdown和相应的ValueChangedFcn函数:

1
2
3
4
5
6
7
8
9
10
clc,clear,close all

fig = uifigure("Position",[680,558,180,180],"WindowStyle","alwaysontop");
dropdown = uidropdown(fig,"Position",[17.70,11.00,83.37,22.00],...
    "ValueChangedFcn",@callback_uidropdown);

function callback_uidropdown(src,~)
disp("Value changed!")
disp(src.Value)
end

当在GUI中修改uidropdown的选项时,会调用回调函数callback_uidropdown

image-20230525134555824

使用代码修改uidropdown的值也可以修改GUI中的显示,但是不会调用回调函数

1
set(dropdown,"Value","Option 1");

image-20230525134738926

1
dropdown.Value = "Option 3";


state类型uibutton控件的"ValueChangedFcn"回调函数也是类似的:

1
2
3
4
5
6
7
8
9
10
clc,clear,close all

fig = uifigure("Position",[680,558,180,45],"WindowStyle","alwaysontop");
button = uibutton(fig,"state","Position",[17.70,11.00,83.37,22.00],...
    "ValueChangedFcn",@callback_uibutton);

function callback_uibutton(src,~)
disp("Value changed!")
disp(src.Value)
end

可以进行同样的验证。


在编写GUI时需要注意这个小特性,否则会出现一些意料之外的错误。