Matlab GUI 多窗口 编程总结
以一个实际例子中的代码为例: https://github.com/borninfreedom/robotics_arm/blob/master/RobotStudio/RobotStudio.m
第947行为例。
h = figure_yoshikawa; %多窗口编程
h = guihandles(h);
创建好主窗口后,请仔细阅读主窗口开始几行的注释,如图:
第一个箭头那表示可以使用这个获得这个窗口的句柄,第二个箭头表示是否允许多窗口编程,0就是允许。
然后使用GUIDE创建第二个窗口,在第二个窗口的空白部位
就是没有空间的部位双击,打开当前窗口的属性。最重要的两个:Tag 和 Name。 Tag是我们获取句柄的索引名称,Name是窗口的标题。(有个例外,h = figure_yoshikawa;这句,子窗口的Tag就是figure_yoshikawa, 同时子窗口的Gui_Singleton设置为1,这样就可以获取到子窗口的句柄,但是对于主窗口是无效的,主窗口的Tag不管怎么设置,如果想在子窗口中获取主窗口的句柄,需要用主窗口的文件名,比如我的是 RobotStudio.m ,那么需要用 h = RobotStudio)
我设置子窗口的Tag为 figure_yoshikawa, 如果在一个Button的Callback里面写一句 h = figure_yoshikawa, 那么点击按钮,就会打开这个窗口,此时主窗口和子窗口并没有数据传递。
但是如果再加上一句 h = guihandles(h); 此时就可以把 h 当做 handles来用。比如说handles.text1指主窗口的text1,那么h.text1就是子窗口的text1.
就像这样,可以方便的进行父子窗口的数据传递。
同样,建议所有的全局变量用 handles.xxx = xxx来表示,尽量不要使用global。除去global的效率非常低下,global在多窗口的数据传递上是个短板,如果使用handles的话,在子窗口中使用
h = figure_main;
h = guidata(h);
handles.v = h.v;
就可以方便的把主窗口中的v变量拿到子窗口中来用。但是global就不怎么好用。