Matlab中使用GUIDE工具开发图形用户界面(GUI)
文章目录
- 1. 初识GUIDE工具
- 1.1 .m 和 .fig的区别和联系
- 1.2 GUIDE工具的详细介绍
- 1.3 GUI控件的属性
- 1.4 自动生成的 .m 文件
- 1.5 回调函数
- 2. GUI中常见的函数
- 2.1 get 和 set 函数
- 2.2 handles.Tag
- 2.3 OpeningFcn 和 OutputFcn
- 2.4 Callback
- 2.5 CreateFcn 和 DeleteFcn
- 2.6 ButtonDownFcn 和 KeyPressFcn
- 3. GUI 示例
1. 初识GUIDE工具
1.1 .m 和 .fig的区别和联系
在MATLAB中,.m 文件和 .fig 文件是用于创建图形用户界面(GUI)的两个核心文件。
-
.fig 文件
(1) .fig 文件是一个二进制文件,存储了GUI的布局信息,包括所有UI组件(如按钮、文本框、滑块等)的位置、大小、颜色、标签等属性。 .fig 文件不能单独运行,需要与 .m 文件配合才能使GUI具有功能。
(2).fig 文件的作用:定义了GUI的外观和结构;.fig 可以通过MATLAB的GUIDE或 App Designer工具创建。
(3).fig 文件的生成方式:使用 GUIDE 或 App Designe 创建 .fig 文件。GUIDE 是 MATLAB 提供的一个图形化工具,用于快速设计和创建 GUI。首先在 MATLAB 命令行窗口中输入guide
并按回车键,这将打开 GUIDE 的启动界面;然后选择模板或空白项目,进而设计GUI 布局;最后保存文件,默认情况下,GUIDE 会生成两个文件:【1】.fig:存储 GUI 的布局信息。【2】.m:包含 GUI 的初始化代码和回调函数。.fig和.m的文件名必须严格一致,否则无法正确加载。还可以在MATLAB 命令行窗口输入appdesigner
,并按下回车键,会打开GUI启动界面。 -
.m文件
(1).m 文件是一个脚本文件(MATLAB代码文件),包含GUI的功能逻辑代码,定义了每个UI组件的行为和响应事件的回调函数(callback)。可以直接运行 .m 文件来启动GUI。
(2).m 文件的作用:实现GUI的功能,例如按钮点击后执行的操作、数据处理逻辑等。包含初始化代码,负责加载 .fig 文件并设置默认参数。用户可以在这里编写自定义代码来扩展GUI的功能。 -
二者联系
(1).m 文件依赖于 .fig 文件来定义GUI的布局和外观。.fig 文件本身没有功能,必须通过 .m 文件中的代码来实现交互。
(2)当运行 .m 文件时,MATLAB会自动加载对应的 .fig 文件,并根据其中的布局信息生成GUI窗口。然后,.m 文件中的回调函数会被绑定到各个UI组件上,使得GUI具备功能性。
(3)通常 .fig 文件和 .m 文件的名称相同(例如 myGUI.fig 和 myGUI.m),以便MATLAB能够正确关联两者。 -
总结
(1).fig 定义GUI 的外观和布局。.m 定义GUI的功能和逻辑。
(2)如果你使用的是较新的MATLAB版本(R2016a及以上),推荐使用App Designer(即在MATLAB 命令行窗口输入命令appdesigner
),它将 .fig 和 .m 的功能整合到了一个更现代化的开发环境中,简化了GUI开发流程。
1.2 GUIDE工具的详细介绍
MATLAB 的 GUIDE(Graphical User Interface Development Environment,图形用户界面开发环境)是 MATLAB 提供的一种用于开发图形用户界面(GUI)的可视化工具。GUIDE 提供了一个拖放式的设计环境,允许用户通过直观的方式创建和布局 GUI 组件,并为这些组件编写回调函数以实现交互功能。
-
GUIDE 的工作流程
(1)启动 GUIDE:在 MATLAB 命令行窗口中输入命令guide
;
(2)创建或打开 GUI:可以选择创建一个新的 GUI 或打开已有的 .fig 文件;
(3)设计 GUI 布局:使用 GUIDE 提供的工具箱,将按钮、文本框、滑块等控件(组件)拖放到 GUI 窗口(空白界面)上,然后可以调整控件的大小、位置和属性(如标签、字体、颜色等)。
(4)生成代码:当完成布局后,GUIDE 会自动生成 .m 和 .fig 两个文件。其中,.m 文件包含 GUI 的初始化代码和回调函数模板;.fig 文件保存 GUI 的外观和布局。
(5)编写回调函数:回调函数是当用户与控件(组件)交互时触发的代码块。用户需要根据需求在回调函数中编写具体的逻辑代码。
(6)运行和测试 GUI:运行 .m 文件以启动 GUI,并测试其功能是否符合预期。 -
GUIDE 的主要组件(控件)
GUIDE 提供了多种控件,用于构建 GUI 的不同功能模块。以下是一些常用的控件及其用途:
(1)Push Button (按钮、按键):按钮,点击时触发回调函数;
(2)Toggle Button (切换按钮):开关按钮,状态可以在按下和弹起之间切换;
(3)Slider (滑动条、滚动条):滑块,用于选择数值范围;
(4)Edit Text(文本编辑框):文本框,允许用户输入文本或数字;
(5)Static Text:静态文本,用于显示信息;
(6)Popup Menu (弹出式菜单):下拉菜单,提供选项列表;
(7)Axes (坐标轴):图形区域,用于绘制图像或图表;
(8)Listbox (列表选择框):列表框,允许用户选择多个选项;
(9)Checkbox (检查框):复选框,用于选择布尔值选项;
(10)Radio Button (单选框):单选按钮,用于选择一组选项中的一个。
(11)还有其它的控件…
1.3 GUI控件的属性
我们 “双击控件” 或者 “右键单击控件” ——>选择 “属性检查器”,可以打开检查器对话框,控件的属性如下图所示。
下面对常见的控件属性进行介绍:
- 控件的通用属性(适用于所有控件)
(1)Tag:控件的唯一标识符,用于在代码中引用该控件(必须唯一)。示例:设置按钮的 Tag 为 btnPlot,代码中通过handles.btnPlot
来访问该控件。
(2)String:控件上显示的文本内容(如按钮标签、文本框内容)。示例:按钮的 String 设为 “Plot Data”,显示为“Plot Data”。
(3)Position:控件的位置和大小,格式为[x, y, width, height]([左, 下, 宽, 高])。示例:[100, 50, 80, 30]表示控件左上角位于(100,50),宽80像素,高30像素。
(4)Callback:用户与控件交互时(如点击按钮)触发的函数。示例:按钮的Callback设为@pushbutton1_Callback,点击控件时执行该函数。
(5)Enable:控件是否可交互 或者说 控件是否可用(‘on’或’off’)。示例:禁用按钮——set(handles.btnSubmit, ‘Enable’, ‘off’)。
(6)Visible:控件是否可见(‘on’或’off’)。示例:隐藏错误提示文本——set(handles.textError, ‘Visible’, ‘off’)。
(7)BackgroundColor:控件的背景颜色,格式为 RGB 三元组或颜色名称。示例:BackgroundColor = [1, 0, 0](红色)或 ‘red’。
(8)FontName:字体名称(如 ‘Arial’)。示例:FontName = ‘Times New Roman’。
(9)FontSize:字体大小(单位:磅)。示例:FontSize = 12。
-
控件的特有属性
有关控件的特有属性就不做过多介绍了,等啥时候用到了再查。 -
控件的 Value和String 属性
(1)Value 属性:表示控件的数值状态或选中项的索引。其适用的控件有:滑动条(slider)、单选按钮(radiobutton)、复选框(checkbox)、弹出菜单(popupmenu)、列表框(listbox)、切换按钮(togglebutton)等。Value 属性的特点包括:通常是数值(如滑块的当前位置、选项的索引);对于单选按钮/复选框:Value = 1 表示选中,Value = 0 表示未选中;对于弹出菜单/列表框:Value 是选中项的索引(从1开始)。
(2)String 属性:表示控件显示的文本内容或选项列表。其适用的控件有:按钮(pushbutton)、文本框(edit)、静态文本(statictext)、弹出菜单(popupmenu)、列表框(listbox)等。String 属性的特点包括:存储文本字符串或字符串数组(如多行文本或选项列表);对于弹出菜单/列表框:String 是显示的所有选项(如 {‘Option1’, ‘Option2’})。
(3)属性 Value 和 String 的联系:某些控件需要同时设置 String 和 Value 以实现功能。例如:在弹出菜单 (popupmenu)中,String 定义选项列表(如 {‘A’, ‘B’, ‘C’});Value 表示当前选中的索引(如 Value = 2 表示选中“B”)。在列表框 (listbox)中,String 定义所有选项;Value 可以是单个索引或多个索引(多选模式下)。用户通过 String 看到的文本选项,需要通过 Value 转换为程序可处理的数值索引或状态。
1.4 自动生成的 .m 文件
我们使用工具 GUIDE 生成空的 main.fig (空的图形用户界面(GUI))对应的 main.m 文件模板如下所示。
function varargout = main(varargin)
% MAIN MATLAB code for main.fig
% MAIN, by itself, creates a new MAIN or raises the existing
% singleton*.
%
% H = MAIN returns the handle to a new MAIN or the handle to
% the existing singleton*.
%
% MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MAIN.M with the given input arguments.
%
% MAIN('Property','Value',...) creates a new MAIN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before main_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to main_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help main% Last Modified by GUIDE v2.5 27-Feb-2025 20:08:57% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @main_OpeningFcn, ...'gui_OutputFcn', @main_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before main is made visible.
function main_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to main (see VARARGIN)% Choose default command line output for main
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes main wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = main_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;
- 剖析参数:varargin、varargout、nargin 和 varargin
(1)nargin 和 nargout都是内置变量。其中,nargin 表示调用当前函数时实际传入的输入参数数量;nargout 表示调用当前函数时实际返回的输出参数数量。
(2)varargin 和 varargout都是特殊的 cell 数组(元胞数组)。其中,varargin 用于接收任意数量的输入参数;varargout 用于返回任意数量的输出参数,即 varargout 动态返回不同数量的输出结果。varargin使用场景:当你不知道调用者会传递多少额外参数,或者希望函数支持可选参数时,可以使用 varargin。varargout使用场景:当函数可能根据调用者需求返回不同数量的输出值时,使用 varargout 可以灵活处理。
(3)代码示例1:使用 varargin 和 nargin
result = test(2,3,5,6,7,8);
fprintf('result = %d\n', result);function result = test(a, b, varargin)% 显示输入参数的总数fprintf('总输入参数个数(nargin):%d\n', nargin);% 参数 vararginfprintf(class(varargin));fprintf('\n');% 返回 a 和 b 的和result = a + b;
end输出结果:
总输入参数个数(nargin):6
cell
result = 5
(4)代码示例2:使用 varargout 和 nargout
% 调用test(2,3)只有一个输出值result,因此MATLAB会自动将 varargout{1} 的内容提取出来并赋值给 result
result = test(2,3);
% 调用test(2,3)有两个输出值result1和result2,因此MATLAB会自动将varargout{1}的内容提取出来
% 赋值给result1, 将varargout{2}的内容提取出来赋值给result2。
[result1,result2] = test(2,3);
fprintf('result = %d\n', result);
fprintf('result1 = %d\n', result1);
fprintf('result2 = %d\n', result2);function varargout = test(a, b)% 使用 nargout 判断调用者请求了多少个输出if nargout == 1% 只请求一个输出,则返回 a 和 b 的和varargout{1} = a + b;elseif nargout == 2% 请求两个输出,则分别返回和与乘积varargout{1} = a + b;varargout{2} = a * b;elseerror('最多只支持两个输出参数!');end
end输出结果:
result = 5
result1 = 5
result2 = 6
- 函数句柄
句柄(Handle) 是一种特殊的对象类型,它允许你通过“引用”操作对象,而不是通过“值”。句柄类的核心特点是:多个变量可以指向同一个对象实例。修改其中一个变量的属性时,所有指向该对象的变量都会同步变化。这与传统的“值类”(默认行为)形成鲜明对比,你可以将句柄理解为对象的引用。函数句柄是通过符号 @ 创建,创建语法格式: Function_Handle = @Function_Filename
。代码示例如下:
% 我们将函数句柄放到结构体中
str = struct('Name','test', ...'f_sin', @sin, ...'f_add', @add);result1 = str.f_sin(pi/2); % 输出1
result2 = str.f_add(2,4); % 输出6
disp(result1);
disp(result2);function sum = add(x, y)sum = x+y;end
- 剖析参数 mfilename
在 MATLAB 中,mfilename 是一个内置函数,用于返回当前正在执行的 M 文件的文件名(不包含路径和扩展名)。它可以帮助你在代码中动态获取当前脚本或函数的文件名,这在调试、日志记录或动态生成文件名时非常有用。下面介绍 mfilename 的用法:
(1)默认用法(不带参数):直接调用 mfilename
会返回当前 M 文件的基本名称(不带路径和 .m 扩展名)。
(2)带参数用法:带参数 ‘fullpath’ ——mfilename('fullpath')
返回当前执行的脚本或函数的完整路径(不带 .m 扩展名)。
(3)代码示例,假设你正在编辑一个名为 example_function.m 的文件,运行以下代码:
disp(mfilename);
disp(mfilename("fullpath"));输出结果:
example_function
D:\MatlabProject\SIsoftware\Code\example_function
- ischar() 函数
在 MATLAB 中,ischar 是一个用于判断输入是否为字符数组的函数。如果输入是一个字符数组,则返回逻辑值 true(1),否则返回 false(0)。需要注意的是,ischar 仅适用于传统的字符数组(由单引号定义的字符串),而不适用于 MATLAB 的字符串类型(string 类型,由双引号 “” 定义)。代码示例如下:
% 检查字符数组
A = 'Hello, World!'; % 字符数组
result = ischar(A);
disp(result); % 输出:1 (true)% 检查字符串类型(string)
A = "Hello, World!"; % string 类型
result = ischar(A);
disp(result); % 输出:0 (false)% 检查其他数据类型
A = 123; % 数值
result = ischar(A);
disp(result); % 输出:0 (false)A = {'Hello', 'World'}; % 单元数组
result = ischar(A);
disp(result); % 输出:0 (false)
注意事项:(1)字符数组是由单引号 ' '
定义的,例如 'Hello'
;(2)字符串类型是由双引号 " "
定义的,例如 "Hello"
。(3)ischar 只能识别字符数组,不能识别字符串类型。(4)推荐使用 isstring
检查字符串类型:result = isstring("hello"); disp(result); % 输出:1 (true)
。
- str2func() 函数
在 MATLAB 中,str2func 函数用于将字符串形式的函数转换为函数句柄(function handle)。它允许你通过字符串动态地引用函数,这对于编写灵活的代码非常有用,尤其是在需要根据用户输入或配置文件调用不同函数的情况下。语法定义为:fh = str2func(funcName)
,其中 funcName表示一个包含函数名称的字符串(字符数组或字符串类型);fh 表示与指定函数名称相对应的函数句柄。代码示例如下:
% 将字符串 'sin' (或 "sin") 转换为函数句柄,
f_sin = str2func("sin");% 使用函数句柄计算 sin(0)
result = f_sin(0);
disp(result); % 输出:0% 自定义函数 myFunction, 将字符串 'myFunction' 转换为函数句柄
f_func = str2func('myFunction');
result = f_func(4);
disp(result); % 输出:6function output = myFunction(x)output = x + 2;
end
1.5 回调函数
每个控件都可以关联一个回调函数(Callback Function),当用户与控件交互时(如点击按钮或更改滑块值),相应的回调函数会被执行。GUIDE 中常用的 GUI 控件(组件)及其回调函数如下表所示。
UI 组件 | 主要属性 | 主要回调函数 |
---|---|---|
按钮(Push Button) | String(按钮文本) | pushbutton_Callback |
复选框(Checkbox) | Value(0 或 1) | checkbox_Callback |
单选按钮(Radio Button) | Value(0 或 1) | radiobutton_Callback |
列表框(Listbox) | String(列表项) | listbox_Callback |
下拉菜单(Popup Menu) | String(选项列表) | popupmenu_Callback |
编辑框(Edit Text) | String(输入文本) | edit_Callback |
轴(Axes) | XData, YData(图形数据) | axes_Callback |
- 关联事件
步骤:右键组件 → 查看回调(View Callbacks) → 选择事件(如 Callback 对应按钮点击)。通过该步骤,GUIDE会自动生成(或定位)回调函数框架。
2. 剖析参数:hObject, eventdata, handles
在通过 GUIDE 生成的 GUI 应用程序中,回调函数 pushbutton1_Callback(hObject, eventdata, handles)
是按钮控件的默认回调函数模板。这三个参数分别用于传递 GUI 控件的句柄、事件数据和全局句柄结构体。以下是它们的详细说明及示例。
(1)参数 hObject 是触发当前回调函数的控件(或对象)句柄(Handle)。通过 hObject 可以直接操作触发事件的控件属性(例如修改按钮文字、颜色等)。你可以将句柄理解为对象的引用。代码示例如下
function pushbutton1_Callback(hObject, eventdata, handles)% 修改按钮的文字为 "Clicked!"set(hObject, 'String', 'Clicked!');% 修改按钮背景颜色为红色set(hObject, 'BackgroundColor', [1 0 0]);
end当用户点击按钮时,按钮的显示文字会变为 "Clicked!",背景颜色变为红色。
(2)参数 eventdata 是 MATLAB 保留的参数,用于传递事件相关的附加数据。在传统 GUIDE GUI 中,此参数通常为空(这个参数 eventdata 通常是未使用的)。在更高级的控件(如 uitable 表格或图像点击事件)中,eventdata 可能包含事件信息(例如鼠标点击的坐标)。对于参数 eventdata不做过多介绍。
(3)参数 handles 是一个结构体(struct),包含 GUI 中所有控件和自定义数据的句柄。通过 handles 可以在不同回调函数之间共享数据或操作其他控件。注意事项:如果在回调函数中修改了 handles(例如添加了自定义字段:handles.custom_data = output_str
),必须调用 guidata(hObject, handles)
保存修改(将修改后的 handles 更新到全局),否则更改会丢失。
(4)参数 hObject 和 handles 的区别和联系
- hObject:操作当前控件的“快捷方式”,适合修改自身属性。例如,按钮 pushbutton1 被点击时,hObject 就是 pushbutton1 的句柄(引用)。
- handles:GUI 的全局控制中心,包含所有 GUI 组件的句柄,用于操作其他控件和共享数据。例如,按钮 pushbutton1 被点击后,可能需要修改 edit1 的文本,这时就需要 handles.edit1。
- handles 结构体中包含 hObject。例如,
handles.pushbutton1
等价于回调函数中的 hObject。 - 通过 handles 可以在不同回调函数之间共享数据,而 hObject 用于直接操作当前控件。
- 修改 handles 后需调用
guidata(hObject, handles)
,此时 hObject 作为参数确保数据更新到全局。
2. GUI中常见的函数
2.1 get 和 set 函数
-
get 函数用来获取图形对象(如按钮、文本框、坐标轴)的当前属性值。语法:
value = get(对象句柄, '属性名');
(1)示例1。获取编辑框中的文本:user_input = get(handles.edit1, 'String');
(2)示例2。获取滑动条的当前值:slider_value = get(handles.slider1, 'Value');
(3)示例3。获取坐标轴的横轴范围:x_limits = get(handles.axes1, 'XLim');
(4)注意事项。返回值的类型取决于属性(如字符串、数值、数组等)。可能需要类型转换(例如将字符串转换为数值):num = str2double(get(handles.edit1, 'String'));
。 -
set 函数用来设置图形对象(如按钮、文本框、坐标轴等)的属性值。语法:
set(对象句柄, '属性名', 值);
(1)示例1。修改按钮的显示文本:set(handles.pushbutton1, 'String', 'Click Me');
。
(2)示例2。设置背景颜色为红色:set(handles.figure1, 'Color', [1 0 0]);
。
(3)示例3。禁用某个控件:set(handles.edit1, 'Enable', 'off');
。
(4)常见的属性。‘String’:文本内容(如按钮、文本框);‘Value’:数值状态(如滑动条、复选框);‘Visible’:显示或隐藏控件(‘on’/‘off’);‘Position’:控件的位置和大小([x, y, width, height])。
2.2 handles.Tag
GUIDE为每个控件分配默认Tag(如pushbutton1),可在属性检查器中修改。语句 handles.Tag
作用:通过图形对象的Tag属性访问其句柄(对象的引用)。handles是一个结构体,存储了GUI中所有对象的句柄和用户自定义数据。
-
Tag 属性
(1)在GUIDE中创建控件时,需为其指定唯一的Tag(如pushbutton1)。Tag是对象的唯一标识符,用于在handles结构体中引用对象。
(2)可以直接通过handles.Tag
获取对象句柄。例如:% 获取名为 pushbutton1 的按钮句柄 button_handle = handles.pushbutton1;
。
(3)handles结构体用于在回调函数之间传递数据。用户可添加自定义字段保存数据(如handles.my_data),修改handles后需用guidata(hObject, handles)
保存更新。 -
协作关系
(1)handles.Tag
:定位GUI对象(通过Tag获取句柄)。set/get
:操作对象的属性(如显示文本、颜色、状态)。数据持久化:通过修改handles并调用guidata实现跨回调数据共享。
(2)代码示例:在按钮回调中更新文本框内容。
function pushbutton1_Callback(hObject, eventdata, handles)% 获取当前值current_value = get(handles.slider1, 'Value');% 更新文本框set(handles.edit1, 'String', num2str(current_value));% 保存数据(如需)handles.current_value = current_value;guidata(hObject, handles);
end
2.3 OpeningFcn 和 OutputFcn
- OpeningFcn(初始化函数)
(1)这是一个特定于整个 GUI 的函数,通常命名为 figName_OpeningFcn(figName 是你的 GUI 文件名)。
(2)触发时机:GUI启动时,在界面显示之前执行。
(3)用途:初始化全局变量、加载数据、设置默认参数。在CreateFcn之后执行,用于完成GUI的整体初始化。常用于传递输入参数到GUI。
(4)代码示例:
function myGUI_OpeningFcn(hObject, ~, handles, varargin)handles.data = load('default.mat'); % 加载默认数据guidata(hObject, handles); % 更新handles
end
- OutputFcn(输出函数)
(1)这是一个特定于整个 GUI 的函数,通常命名为 figName_OutputFcn(figName 是你的 GUI 文件名)。
(2)触发时机:当 GUI 关闭时调用,或者通过某些操作显式调用。
(3)用途:返回数据到MATLAB工作区。通过handles.output传递输出参数。通常与uiresume配合使用,等待用户操作完成。
(4)代码示例:
function varargout = myGUI_OutputFcn(~, ~, handles)varargout{1} = handles.output; % 返回输出参数
end
2.4 Callback
(1)定义:每个 UI 控件(如按钮、滑块等)都有一个 Callback 属性,它指定了当用户与该控件交互时(例如点击按钮),应该执行的代码。
(2)触发时机:当用户与控件进行交互时触发(如按钮点击、滑块拖动)。
(3)用途:处理控件的默认交互逻辑。
(4)示例:
function pushbutton1_Callback(hObject, ~, handles)disp('按钮被点击!'); % 按钮点击后执行的代码
end
2.5 CreateFcn 和 DeleteFcn
- CreateFcn(创建函数)
(1)触发时机:对象(如窗口、按钮)创建完成后立即触发。
(2)用途:初始化对象属性(如颜色、默认文本)。
(3)特点:每个对象的CreateFcn独立触发。使用gcbo获取当前对象句柄(因对象未完全初始化)。
(4)代码示例:
function figure1_CreateFcn(hObject, ~, ~)set(hObject, 'Color', [0.9 0.9 0.9]); % 设置窗口背景色
end
- DeleteFcn(删除函数)
(1)触发时机:对象被销毁前(如关闭窗口)。
(2)用途:执行清理操作(如保存数据、释放资源)。
(3)代码示例:
function figure1_DeleteFcn(hObject, ~, handles)save('temp_data.mat', 'handles.data'); % 保存临时数据
end
2.6 ButtonDownFcn 和 KeyPressFcn
- ButtonDownFcn(鼠标按下事件)
(1)触发时机:鼠标在对象上按下时。
(2)用途:自定义非标准点击交互(如在坐标轴上绘图)。
(3)条件:需设置PickableParts属性为’on’。
(4)代码示例:
function axes1_ButtonDownFcn(hObject, ~, handles)point = get(hObject, 'CurrentPoint');plot(point(1,1), point(1,2), 'ro'); % 在点击位置画点
end
- KeyPressFcn(按键事件)
(1)触发时机:键盘按下且对象具有焦点时。
(2)用途:处理快捷键或实时输入。
(3)特点:通常用于窗口级事件(需启用WindowKeyPressFcn)。通过get(hObject, ‘CurrentKey’)获取按键信息。
(4)代码示例
function figure1_KeyPressFcn(hObject, eventdata, handles)key = get(hObject, 'CurrentKey');if strcmp(key, 's') % 按下S键保存save_data(handles.data);end
end
- 总结
(1)Callback 是控件的主要功能入口,定义了用户交互时的行为。
(2)OpeningFcn 和 OutputFcn 是 GUI 级别的函数,分别负责初始化和返回数据。
(3)CreateFcn 和 DeleteFcn 是控件级别的函数,分别负责创建和销毁控件时的操作。
(4)ButtonDownFcn 和 KeyPressFcn 是事件处理函数,分别用于响应鼠标点击和键盘按键事件。
3. GUI 示例
要求:设计一个时间转换器,执行小时(h)—>分钟(m)—>秒(s) 的转换。下面给出实现的具体步骤:
-
启动 GUIDE,并生成 time_converter.fig 和 time_converter.m 文件
(1)在命令行窗口输入命令guide
启动 GUIDE;
(2)接着执行操作:文件(F) —> 另存为(A)—> time_converter.fig —> 保存(S),即可生成 time_converter.fig 和 time_converter.m 文件。此时的 time_converter.fig 是一个空的图形用户界面(GUI)。 -
将普通按钮、可编辑文本和静态文本组件从左侧栏拖拽到中间画板上面,如下图所示。
- 调整普通按钮、可编辑文本和静态文本这三个组件的属性
(1)我们 “双击控件” 或者 “右键单击控件” ——>选择 “属性检查器”,可以打开检查器对话框。
(2)将普通按钮组件的"FontSize"属性修改为16;“String” 属性修改为 “时间转换”,按回车(Enter键)保存修改。
(3)将可编辑文本组件的"FontSize"属性修改为12;“String” 属性修改为 “”(空),按回车(Enter键)保存修改。
(4)将静态文本组件的"FontSize"属性修改为12;“String” 属性修改为 “小时(h)”,按回车(Enter键)保存修改。
(5)我们使用 “Ctrl+C/V” 键把可编辑文本和静态文本这两个组件复制两份;并将这两个静态文本组件的"String" 属性分别修改为 “分钟(m)” 和 “秒(s)”。
(6)最终结果如下图所示:
4. 编写回调函数
右键 "时间转换"按钮 组件 → 查看回调(View Callbacks) → 选择 Callback ,通过该步骤GUIDE会自动定位到回调函数框架中。每个组件都有一个名为 “Tag” 的属性,通过代码 handles.Tag
可定位到我们要操作的组件。
(1)这三个可编辑文本的"Tag"属性值分别为:edit1、edit3、edit4,通过代码 handles.edit1
、 handles.edit3
、 handles.edit4
可定义相应的组件。
(2)我们在函数 function pushbutton1_Callback(hObject, eventdata, handles)
写入如下代码:
% 定位到Tag属性值为edit1的组件,并获取edit1组件的String属性值。也就是获取"小时(h)"的值
var = get(handles.edit1, 'String');
% 由于最初的 var 的数据类型是字符数组,因此我们需要通过str2num(var)将字符数组转为数值类型
var = str2num(var);
% 定位到Tag属性值为edit3的组件,并将edit3组件的String属性值修改为var*60。
% 即:分钟(m)=小时(h)×60
set(handles.edit3, 'String', var*60);
% 定位到Tag属性值为edit4的组件,并将edit4组件的String属性值修改为var*60*60。
% 即:秒(s)=小时(h)×60×60
set(handles.edit4, 'String', var*60*60);
- 添加清除数据按钮
我们再添加一个清除数据按钮,用来清除可编辑文本中的数据,并将该按钮的"String"属性修改为"清除数据"。
(1)右键 "清除数据"按钮 组件 → 查看回调(View Callbacks) → 选择 Callback ,通过该步骤后可定位到回调函数框架。
(2)在回调函数function pushbutton2_Callback(hObject, eventdata, handles)
中写入如下代码:
% 将edit1、edit2和edit3组件中的内容修改为空
set(handles.edit1, 'String', '');
set(handles.edit3, 'String', '');
set(handles.edit4, 'String', '');
- 最终的GUI界面如下图所示:
参考视频:
MATLAB GUI教学视频
MATLAB GUI系列(时间充裕可以看,没时间不建议看)
相关文章:
Matlab中使用GUIDE工具开发图形用户界面(GUI)
文章目录 1. 初识GUIDE工具1.1 .m 和 .fig的区别和联系1.2 GUIDE工具的详细介绍1.3 GUI控件的属性1.4 自动生成的 .m 文件1.5 回调函数 2. GUI中常见的函数2.1 get 和 set 函数2.2 handles.Tag2.3 OpeningFcn 和 OutputFcn2.4 Callback2.5 CreateFcn 和 DeleteFcn2.6 ButtonDow…...
[通俗易懂C++]:引用返回和地址返回
在之前的文章中已经提到过,当使用按值传递时会创建参数的一个副本到函数中。对于基本类型(复制成本较低),这是可以的。但对于类类型(如 std::string ),复制通常成本较高。我们可以通过使用(const)引用传递(或按地址传递)来避免进行昂贵的复制。 这篇文章主要介绍一些…...
基于 MySQL 数据库对三级视图(用户视图、DBA视图、内部视图)的详细解释
基于 MySQL 数据库对三级视图(用户视图、DBA视图、内部视图)的详细解释,结合理论与实际操作说明: 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想,MySQL 的实现逻辑如下: …...
LLM - Attention Is All You Need 的理解
一:概述 当前主流的序列转换(sequence transduction)模型主要基于复杂的循环神经网络(Recurrent Neural Networks, RNNs)或卷积神经网络(Convolutional Neural Networks, CNNs),这些模型通常包含编码器(encoder)和解码器(decoder)。 性能最优的模型通常通过“ 注意…...
究竟什么是AI提示词?深入解析与实战应用
随着人工智能技术的飞速发展,AI提示词(AI Prompt)逐渐成为自然语言处理(NLP)领域的热门话题。无论是GPT-3、ChatGPT还是其他大型语言模型,提示词都扮演着至关重要的角色。那么,究竟什么是AI提示…...
deep-research开源框架 Agentic Reasoning
Agentic-Reasoning是由牛津大学团队开源的推理框架. 该框架在GPQA博士级科学题库上准确率提升35%,生物学问题得分从62%跃升至79%,显著优于DeepSeek-R1等闭源模型。 特色:Agentic-Reasoning在定义和实现code agent上做的非常出色。可以借鉴。…...
解锁智能变革密码:浙江大学2025年DeepSeek行业应用案例集深度解析
引言:AI技术驱动的时代浪潮 2025年,人工智能技术已从实验室走向千行百业,成为推动社会经济发展的核心引擎。在这一背景下,浙江大学联合DeepSeek团队推出的《2025年DeepSeek行业应用案例集》(以下简称“案例集”&#…...
C# Unity 唐老狮 No.5 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…...
《2025软件测试工程师面试》功能测试篇
什么是功能测试? 功能测试是通过验证产品功能是否满足用户需求的过程,主要关注软件的功能是否符合需求规格说明,包括软件的各种功能、特性、性能、安全性和易用性等。 功能测试的流程包括哪些步骤? 需求分析:明确软件需求,确定测试范围。测试计划:制定详细的测试计划,…...
DeepSeek如何快速开发PDF转Word软件
一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的PDF转Word工具有收费的WPS,免费的有PDFGear,以及在线工具SmallPDF、iLovePDF、24PDF等。然而,大多数免费在线转换工具存在严重隐私风险——文件需上…...
ROS环境搭建
ROS首次搭建环境 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好,建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...
深入探索DeepSeek开源之旅:开源Week全程解析
摘要 在农历新年刚刚结束之际,DeepSeek以卓越的开源精神,连续六天举办了开源Week活动。这一系列活动不仅展示了DeepSeek在技术领域的活跃度和影响力,还彰显了其对开源社区的贡献。通过这次活动,DeepSeek吸引了众多开发者和技术爱好…...
Redis是什么?如何使用Redis进行缓存操作?
Redis(Remote Dictionary Server)是一款高性能的内存键值存储系统,广泛用于缓存、消息队列、会话存储和实时数据处理等场景。它基于内存存储,支持多种数据结构,如字符串、列表、集合、有序集合和哈希表等,具…...
Unity学习笔记之——ugui的性能优化
在Unity中UI优化的核心问题就是重绘和批处理之间的平衡 一、Canvas优化要点 1.优化原因: (1)Unity为了性能优化,会合并Canvas下的所有元素; (2)如果把所有面板放到一个Canvas下,会…...
【三.大模型实战应用篇】【2.智能学员辅导系统:与大模型的深度交互】
早上七点半,初三学生小林打开数学辅导APP,发现AI老师准确指出了他昨晚作业中三次跳步计算的坏习惯——这比他亲妈观察得还细致。这背后是一场发生在代码深处的"脑力风暴",让我们潜入智能辅导系统与大模型深度交互的"暗室",看看那些让教育产生化学反应的…...
【vue-echarts】——04.配置项---legend
文章目录 一、配置项-legend图例二、显示结果一、配置项-legend图例 图例组件展现了不同系列的标记,颜色和名字。可以通过点击图例控制哪些系列不显示。 代码如下 Demo4View.vue <template><div class="about">...
面试题02.02.返回倒数第k个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 k 2 输出: 4 说明: 给定的 k 保证是有效的。 题解ÿ…...
剑指 Offer II 041. 滑动窗口的平均值
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20041.%20%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E7%9A%84%E5%B9%B3%E5%9D%87%E5%80%BC/README.md 剑指 Offer II 041. 滑动窗口的平均值 题目描述 给定一个整数…...
OCR PDF 文件是什么?它包含什么内容?
有些 PDF 文件是通过扫描纸质书页生成的,这类文件有其独特的特点。有时,原始书籍是唯一可用的版本,因此只能通过扫描的方式获取内容。 如何识别 OCR PDF 文件? 你通常可以从外观上辨别 OCR PDF 文件——页面上的文本看起来像“锯…...
什么是最终一致性,它对后端系统的意义是什么
最终一致性(Eventual Consistency)是分布式系统中的一种一致性模型。与传统的强一致性模型不同,最终一致性并不要求系统在任何时刻都保持一致,而是保证在足够的时间后,所有节点的数据最终会达到一致的状态。换句话说,系统允许短时间内出现数据的不一致性,但最终会通过某…...
CSS3中布局方式说明
CSS3 提供了多种灵活的布局方式,适用于不同的场景和需求。以下是主要的布局方式及其特点: 1. Flexbox 布局(弹性盒子) 用途:一维布局(水平或垂直方向排列元素)。特点: 通过 display…...
【开源-常用开源c/c++日志管理模块对比】
[TOC](开源-常用开源c/c日志管理模块对比) 项目名称语言优点缺点适用场景开源代码链接spdlogC高性能,支持异步日志;丰富的格式化功能;跨平台;易于集成。依赖C11或更高版本;不适合嵌入式系统。高…...
基于log4j的自定义traceid实现
思路就是spring 做切面拦截请求,切面入口时生成traceId,然后放到MDC里面(就是threadLocal,MDC是log框架提供的工具类,能方便在配置文件里面引用插入的值)。 切面结束时traceId。 import com.sing.monitor…...
如何在网页上显示3D CAD PMI
在现代制造业中,3D CAD模型已成为产品设计和制造的核心。为了更有效地传达设计意图和制造信息,产品和制造信息(PMI)被嵌入到3D模型中。然而,如何在网页上清晰、准确地显示这些3D CAD PMI,成为了一个重要的技…...
LLMR: Real-time Prompting of Interactive Worldsusing Large Language Models
LLMR-使用大型语言模型的交互式世界实时建模 ABSTRACT 我们提出了混合现实的大语言模型(LLMR),一个使用LLM实时创建和修改交互式混合现实体验的框架。LLMR利用新颖的策略来解决理想训练数据稀缺的困难情况,或者设计目标需要综合内…...
使用 OpenLIT 对 LLM 应用进行可观测
大规模语言模型(LLM)的可观测性 随着大规模语言模型(LLM)在各个领域的广泛应用,确保这些模型的稳定性和性能变得至关重要。为了实现这一目标,可观测性(Observability)成为了一个关键…...
C与C++的区别
C 深度剖析:对比 C 语言的显著差异 在编程的浩瀚宇宙中,C 和 C 堪称两颗耀眼的巨星,各自绽放出独一无二的光彩。C 语言作为经典的结构化编程语言,多年来在系统开发、嵌入式编程等领域始终占据着举足轻重的地位。而 C 作为 C 语言…...
【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
https://time.geekbang.org/column/article/118826 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的? 2.5介绍了渲染流水线中的 DOM 生成、样式计算和布局三个阶段,2.6讲解渲染流水线后面的阶段…...
开放鸿蒙认证,OpenHarmony兼容性认证介绍
Ⅰ、OpenHarmony开放鸿蒙兼容性测试认证:使用官方测试套件,对照PCS自检表中的必测项,在本地搭建的环境中对伙伴设备进行预测,直至取得合格的兼容性测试报告。 注:2025年01月01日起,不支持新产品基于老分支…...
磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)
背景: 最近往数据库里存的东西有点多,磁盘不够用 查看磁盘使用情况 df -h /dev/sda5(根目录 /) 已使用 92% 咱们来开源节流 目录 背景: 一、开源 二、节流 1.查找 大于 500MB 的文件: 1. Snap 缓存…...
【2】好未来JAVA开发工程师部分笔试题解析
编程题 1.降序的子数组最大元素和 给你一个正整数组成的数组nums,返回nums中一个降序子数组的最大可能元素和。 子数组是数组中的一个连续数字序列。 已知子数组[nums l, nums l1, … , nums r-1, nums r],若对所有l (1<i<r),nums …...
LeetCode 21. 合并两个有序链表(Python)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[] 示例 3: 输…...
Y3学习打卡
网络结构图 YOLOv5配置了4种不同大小的网络模型,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中 YOLOv5s 是网络深度和宽度最小但检测速度最快的模型,其他3种模型都是在YOLOv5s的基础上不断加深、加宽网络使得网络规模扩大,在增强…...
2025-3-3 二叉树的存储结构
一、二叉树的存储结构( 顺序存储,链式存储) 1.顺序存数--(用数组) (完全二叉树)常考的基本操作: i 的左孩子 -----2i 右孩子-----2i1 i的父节点-----[i/2] 向下取整 i所在的层…...
RK3588V2--ES8388声卡适配记录
RK3588V2--ES8388声卡适配记录 1. ES8388声卡简单介绍2. 适配过程2.1 设备树配置 3. 问题分析与解决3.1 现声卡平台设备, 最终注册失败3.2 系统查看 I2C 设备3.3 怀疑是没有上拉电阻? 4. 测试阶段4.1 耳机接口测试--OK4.2 MIC测试--无法使用 5. 分析总结 1. ES8388声…...
【http://noi.openjudge.cn/】4.3算法之图论——1538:Gopher II
[【http://noi.openjudge.cn/】4.3算法之图论——1538:Gopher II] 题目 查看提交统计提问 总时间限制: 2000ms 内存限制: 65536kB 描述 The gopher family, having averted the canine threat, must face a new predator. The are n gophers and m gopher holes, each at di…...
PySide(PyQT)的视图(QGraphicsView)范例(一) 基本框架
最近学习了视图(QGraphicsView)的知识,总结一下,做一个demo以备忘。在demo中使用了场景(QGraphicsScene)、矩形框(QGraphicsRectItem)等构件,以及演示了常用的设置方法和…...
opencv 模板匹配方法汇总
在OpenCV中,模板匹配是一种在较大图像中查找特定模板图像位置的技术。OpenCV提供了多种模板匹配方法,通过cv2.matchTemplate函数实现,该函数支持的匹配方式主要有以下6种,下面详细介绍每种方法的原理、特点和适用场景。 1. cv2.T…...
_mm_shuffle_epi32解析
一 概述 _mm_shuffle_epi32和_MMSHUFFLE是与SSE指令集相关的开发工具,主要用于SIMD向量操作。 二 _mm_shuffle_epi32 函数 功能:对128位整数向量(__m128i)中的四个32位整数进行重排序 原型:__m128i _mm_shuffle_epi32 (__m128i a, int imm…...
Tauri+React+Ant Design跨平台开发环境搭建指南
TauriReactAnt Design跨平台开发环境搭建指南 一、环境配置与工具链搭建 1.1 基础环境准备 必备组件: Rust工具链(v1.77): curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh Node.js LTS(v20.11.1&a…...
《基于Selenium的论坛系统自动化测试实战报告》
一、项目背景与技术选型 项目简介 目标系统:论坛系统 核心功能:用户注册/登录、会话框发送信息、好友列表、信息发送 技术栈:html Springboot MySQL数据库 为什么选择Selenium 支持多浏览器兼容性测试(Chrome/Firefox/Edge&…...
洛谷 P11830 省选联考2025 幸运数字 题解
题意 小 X 有 n n n 个正整数二元组 ( a i , b i ) ( 1 ≤ i ≤ n ) (a_i, b_i) (1 \leq i \leq n) (ai,bi)(1≤i≤n)。他将会维护初始为空的可重集 S S S,并对其进行 n n n 轮操作。第 i ( 1 ≤ i ≤ n ) i (1 \leq i \leq n) i(1≤i≤n) 轮操作中&#…...
清华北大DeepSeek六册
「清华北大-Deepseek使用手册」 链接:https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理) 1-6版本链接:https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …...
ubuntu部署gitlab-ce及数据迁移
ubuntu部署gitlab-ce及数据迁移 进行前梳理: 在esxi7.0 Update 3 基础上使用 ubuntu22.04.5-server系统对 gitlab-ce 16.10进行部署,以及将gitlab-ee 16.9 数据进行迁移到gitlab-ce 16.10 进行后总结: 起初安装了极狐17.8.3-jh 版本(不支持全局中文,就没用了) …...
什么是 MGX:MetaGPT
什么是 MGX:MetaGPT MetaGPT是由思码逸(OpenDILab)团队开发的一款专注于生成式AI驱动的软件开发框架,MGX可能是其衍生或升级的相关成果,它创新性地将大语言模型引入软件开发流程,模拟人类软件团队的协作方式,能让用户通过自然语言描述需求,即可自动生成完整的软件项目,…...
C++,leecode字符串常见API
在LeetCode上刷C题目时,熟练掌握字符串相关的常见API可以大大提高代码效率和可读性。以下是C标准库(<string>)中常用的字符串操作API: 1. 初始化和赋值 std::string s1 "hello"; // 直接初始化 std::string s2…...
Ubuntu 安装 stable-diffusion-webui-docker 常见问题处理方法
安装 Stable Diffusion WebUI Docker 工程地址 https://github.com/AbdBarho/stable-diffusion-webui-docker 第一步是 git clone 下来 Setup 阅读 README 中的 setup,进入页面 https://github.com/AbdBarho/stable-diffusion-webui-docker/wiki/Setup docker …...
长时间目标跟踪算法(3)-GlobalTrack:A Simple and Strong Baseline for Long-termTracking
GlobalTrack的原始论文和源码均已开源,下载地址。 目录 背景与概述 1.1 长期视觉跟踪的挑战 1.2 现有方法的局限性 1.3 GlobalTrack的核心思想 算法原理与架构 2.1 全局实例搜索框架 2.2 Query-Guided RPN(QG-RPN) 2.3 Query-Guided RCNN&a…...
深入理解指针与回调函数:从基础到实践
引言 在C语言中,指针和回调函数是两个非常重要的概念。指针为我们提供了直接操作内存的能力,而回调函数则为我们提供了一种灵活的编程方式,使得我们可以将函数作为参数传递给其他函数,从而实现更加模块化和可复用的代码。本文将深…...
算法学习新姿势:从0开始用hello-algo搭建自己的在线学习平台
文章目录 前言1.关于hello-algo2.安装Docker和Docker compose3.本地部署hello-algo4. hello-algo本地访问5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 今天要给大家安利一款绝对不能错过的开源神器——Hello-Algo!无论你是刚踏…...