matlab设计GUI可视化界面全方位解析

一、GUI的基础知识

GUI指的是图形化用户界面,广泛用在各种程序的上位机,能够通过简单的操作和按钮就可以调用底层代码,方便我们使用和展示结果。写好了底层的代码后我们就可以制作一个GUI界面来打包和展示。

开始生成GUI界面

首先打开matlab,在命令行界面输入guide指令就可以出现以下界面,其中有四个备选项,后三个都是一些模板,大家可以自行尝试,我们主要讲空白操作:
在这里插入图片描述
生成Blank Gui后会产生一个.fig文件和一个.m文件。.m文件大家都知道,就是matlab的程序文件,在其中写文件。.fig文件是图窗文件。在我们生成一个新的GUI完毕后会生成编辑窗口,这个图窗也可以通过右键点击.fig文件在guide中打开。
在.m文件中,生成的初始部分我们都不需要修改,当我们在GUI中添加了组件后,.m文件中会生成响应的回调函数,我们只需要编辑回调函数就可以实现相应的操作。这个过程在java生成图形化界面的思想是类似的。GUI的初始文件内容如下:

function varargout = blankgui(varargin)
% BLANKGUI MATLAB code for blankgui.fig
%      BLANKGUI, by itself, creates a new BLANKGUI or raises the existing
%      singleton*.
%
%      H = BLANKGUI returns the handle to a new BLANKGUI or the handle to
%      the existing singleton*.
%
%      BLANKGUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in BLANKGUI.M with the given input arguments.
%
%      BLANKGUI('Property','Value',...) creates a new BLANKGUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before blankgui_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to blankgui_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 blankgui

% Last Modified by GUIDE v2.5 02-Jun-2020 16:33:33

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @blankgui_OpeningFcn, ...
                   'gui_OutputFcn',  @blankgui_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before blankgui is made visible.
function blankgui_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 blankgui (see VARARGIN)

% Choose default command line output for blankgui
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes blankgui wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = blankgui_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;

生成的代码看起来复杂,但我们只需要注意除了OpeningFcn和OutputFcn其他地方都不要修改就行了。注意,这两个函数在GUI产生的时候会先按顺序执行一遍,然后在检查你是否对控件有操作上述的两个函数是回调函数,那么回调函数是什么意思呢?

回调函数

简单介绍,在GUI设计中回调函数就是我们在界面上进行相关操作后需要执行的函数。matlab中的回调函数分为五种:
1、Callback
这是最常用的回调函数,比如一个普通按钮,当你按下时,就会调用Callback函数执行,一个文本框,当你输入内容时,就可以执行Callback中的内容,比如要检查内容是否符合格式等等。总之,对一个控件执行默认的操作,Callback就会执行。实现功能,主要就是写在Callback下,当按下这个按钮时我们就可以使matlab开始某种计算然后画图。
2、CreateFcn
在显示某个控件之前执行里面的代码,比如某个控件要有先行条件,我们可以在这里面准备好。这个回调较少使用,我也没用过。
3、DeleteFcn
在使某个控件消失或关闭之前执行的代码,比如关闭时的自动保存,关闭时的确认是否关闭,都可以放在这里面。
4、ButtonDowmFcn
指的是鼠标在这上面点一下后执行的代码。对一个普通按钮就只能按下,Callback会覆盖掉这个函数的内容。对其他的控件,这个回调很多时候也起辅助作用,毕竟对一个可编辑文本框,你点他干啥,文本框就是拿来输入内容的。
5、KeyPressFcn
当某个控件被选中获得焦点时执行的代码。什么是焦点,比如你打开两个word,你输入的字只会出现在一个word上,因为此时的焦点在这个word上。

Handles结构体

Handles结构体包含了gui中所有对象的属性,包括你建立的控件。使用tag属性来索引每个控件,比如handles.edit1指的就是这个可编辑文本框。Handles可以用来值传递,在一个function中将指存入handles,就可以在另一个function中取出这个值。你可以在后文看见很多使用handles进行值传递操作的例子。

GUI中的参数传递

在GUI的.m文件中,参数不像一个可执行文件.m一样可以随意传递,因为GUI的.m文件中是以function的形式写的,参数不能在这些function之间随意传递,现总结以下两种方法:
1、使用全局变量
在GUI打开的初始化时,我们定义好全局变量。定义在哪呢?我们刚才提到了初始化.m文件中可编辑的是什么啊?对,就是OpeningFcn和OutputFcn,当我们打开这个fig的时候OpeningFcn中的内容会自动执行,此时我们可以将初始化内容放在这个里面,就比如参数的初始化。
定义全局变量使用global x,要使用到这个变量时,需要在回调函数中再次声明global x才能使用,这件的好处是简单,但是全局变量的缺点就是一处改处处改,变量得不到保护。
2、使用guidata和handles结合的方法
如果在一个控件的回调函数中产生的参数想要传递出去可以这么写,使用这种方法末尾一定要添加guidata()

handles.X=X;
handles.Y=Y;
guidata(hObject, handles);

上述语句将要传出的数据存进了handles结构体中,如果要在另一处调用参数,可以这么写:

X1=handles.X;
Y1=handles.Y;
plot(X1,Y1)

handles结构体也包含了gui控件的所有属性,可以调用和修改。
总之,在matlab的gui中进行值传递需要有特殊的操作,以下博客给出了更多的方法:https://www.cnblogs.com/jmliao/p/5628521.html

二、控件介绍

选择blank后是如下界面:
在这里插入图片描述

一、普通按钮

在这里插入图片描述
普通按钮功能是作为触发一个事件trigger。点一下就执行Callback中的内容。双击控件我们可以进入配置界面:
在这里插入图片描述在这里插入图片描述在这里面我们可以设置回调、文字、各种属性。
我们结合其他的控件来讲button。

二、可编辑文本(edit)和静态文本(text)

在这里插入图片描述
可编辑文本是在运行时输入内容的,比如账号密码。静态文本只起显示内容作用。
我们结合button来完成一个简单的任务:当我按下button时,读取可编辑文本中的内容到静态文本中显示。

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
txt=get(handles.edit1,'string');
set(handles.text2,'string',txt);

这里就使用了set和get函数,使用了handles结构体进行值传递,不需要在文本框的回调函数中写任何内容。在这里插入图片描述
这样我们就可以采集用户给的数据和显示了。另外,上述代码是读取字符的如果想要读取数字的话,需要使用 str2double()处理输出。

三、单选框(radiobutton)和复选框(checkbox)

在这里插入图片描述
根据笔者的观察,单选框和复选框只是外型的不同,要实现选项互斥还是得依靠回调函数代码实现。我们结合文本框来实现加法和乘法选择,复选框用发类似不再赘述。
实现两个单选框的互斥需要在各自回调函数中操作:
给出单选框回调函数内容:

function radiobutton1_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.radiobutton1,'value',1);
set(handles.radiobutton2,'value',0);
% Hint: get(hObject,'Value') returns toggle state of radiobutton1

一个被选中时将另一个置零。
给出button回调函数内容:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if get(handles.radiobutton1,'value')
    option=1;
elseif get(handles.radiobutton2,'value')
    option=0;
end
num1=str2double(get(handles.edit1,'string'));
num2=str2double(get(handles.edit2,'string'));
if option==0
    num=num1+num2;
else
    num=num1*num2;
end
set(handles.text2,'string',num);

结果如下:
在这里插入图片描述上述就是简单的单选框操作。

四、弹出式菜单(popupmenu)和列表框(listbox)

在这里插入图片描述
弹出式菜但都可以拿来作为选项,那我们怎么写备选项呢?在检查器中找到如下选项:
在这里插入图片描述在这里插入图片描述
按照上述格式就是选项。接下来我们完成一个显示小组组长的任务。
首先我们把一共三个小组输入弹出式菜单:
在这里插入图片描述
然后我们把执行的任务写在回调函数中,因为三个小组的组长分别是张三、李四、王五,所以我们需要建立一个字符数组然后对应过来:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
label=get(handles.popupmenu1,'value');
name=["张三","李四","王五"];
set(handles.text2,'string',name(label));

要注意我们从菜单中get到的是索引,不是菜单的字符内容。

五、坐标区(axes)

接下来我们讲讲坐标区,是一个非常重要的功能,用于画图。我们可以同时在一个界面上插入多个图窗,然后指定我们在哪个图窗里画图。在button的回调函数中我们可以写上之前在其他地方打包好的处理函数,或者定义数据和函数然后画图。这里我演示一个函数绘制工具,在edit框中写入函数,然后选择在哪个框中画出。首先我们设计button回调函数中读取函数名,然后根据单选框状态画出来。

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
syms x;
f=get(handles.edit1,'string');
if get(handles.radiobutton1,'value')
axes(handles.axes2)
else 
axes(handles.axes1) 
end
ezplot(f);

在这里插入图片描述
我们只需要在文本框中输入以x为变量的函数,就可以了,更复杂的操作读者可以自行探索。回调函数的内容怎么写上文已经说明。
说到这里了,已经介绍了很多的控件操作,剩下的使用较少,希望读者自行探索。

三、多个GUI界面的交互

有些时候我们要完成的任务不会只在一个GUI中就能解决,这时需要用到多个GUI的合作和数据交互。

一、打开另一个GUI

这个功能主要通过run()实现,我这里举一个简单的例子,当我们按下button时,弹出一个确认框。
我们先新建一个GUI界面命名为confirm。在其中新建好静态文本和两个button,右下角的黑点可以调整画布大小,使其满足自己的要求:
在这里插入图片描述之后在前一个GUI的button回调函数中写下run(comfirm),此时我们再按下button时就会弹出我们这个gui界面了,用这个方法可以制作处二级的GUI界面,完成更高级的功能。
在这里插入图片描述

二、GUI件参数的传递

看完了上一部分,此时小伙伴们就要问了,我点是或否没有用啊,因为我们没有设置参数的传递,如果此时你新生成的GUI具有独立的功能,那么你完全可以想创建第一个新的那样来写这个GUI,但如果子GUI是一个界面用于设置父GUI需要的各种参数的话,那你就麻烦了。此时两个GUI产生了交互,那我们应该怎么设置呢?
我们加大上个问题的难度,先读取父GUI中的分数,然后在子GUI显示,确认后送回父GUI中显示确认的结果。
当我们在父GUI中按下button时,需要读取文本框中分数的大小,我们先在button的回调函数中写score=get(handles.edit1,'string');用于读取分数并存放在score中,此时我们需要把这个score送入我们的comfirmGUI中,使用out = comfirm(score) 注意此处的out是从子GUI中得到的返回值,score是形参,comfirm换成你自己的子GUI名。所以在button的回调中这么写:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
score=get(handles.edit1,'string');
out = comfirm(score) ;
if out==1
    set(handles.text2,'string',"已确认");
else
    set(handles.text2,'string',"已否认")
end

现在我们关注子GUI写法。我们在父GUI中调用了comfirmGUI,此时按下button就会弹出子GUI,我之前讲了,一个GUI的初始化工作是在OpeningFcn中执行的,我们在这个地方取出父GUI传来的分数,handles.in1 = varargin{1};注意,这个varargin和即将出现的varargout是两个大小可变的数组,用来传送输入和输出。所以在子GUI的OpeningFcn中这么写:

function comfirm_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 comfirm (see VARARGIN)
handles.in1 = varargin{1};
set(handles.text3,'string',['确认分数是',handles.in1,'吗?']);
% Choose default command line output for comfirm
% Update handles structure
guidata(hObject, handles);
uiwait(handles.figure1)

思路是我们得到了varargin传来的数据也就是分数后,显示出来。强调!我在第一部分的时候讲过了,OpeningFcn和OutputFcn是按顺序执行的!我们必须在末尾加上uiwait(handles.figure1)figure1是子GUI的tags,检查器中可以找到。这个语句会让程序停下不再执行OutputFcn,否则一开始输出就确定了那就不需要白费力气了。
接下来我们看button的回调函数,这个很简单:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.out1=1;
guidata(hObject, handles);
uiresume(handles.figure1)

如果是被按下,则返回1并用handles传出。在button回调函数的结尾必须加上uiresume(handles.figure1)这样才能继续回到我们刚才uiwait的地方继续执行OutputFcn,我们看看它的内容:

function varargout = comfirm_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.out1;
delete(handles.figure1); 

varargout是用于将子GUI内的数据传出的载体,之前已经讲过了与之相对的varargin,就不再多说了。在最后我们要加上delete(handles.figure1);表示执行到这个地方关闭子GUI,其中figure1是子GUI的tags。到这个地方我们就回到了父GUI并得到了下图:
在这里插入图片描述到这个地方,多个GUI的关联和值传递就差不多了。

结束语

笔者水平有限,简单地介绍了一下matlab中GUI的各种操作,这些就像是积木一样,了解了最基本的自己通过学习和努力慢慢搭建高楼大厦就可以了。如有错误,欢迎大家指出。

  • 182
    点赞
  • 1220
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
基于Matlab GUI的图像处理系统的可视化用户界面设计需要考虑用户友好性和功能性的平衡。首先,设计一个简洁清晰的界面,包括主菜单、工具栏和状态栏,让用户可以轻松找到并使用各种功能。其次,考虑到图像处理系统的复杂性,可以将一些常用的功能模块设计成可拖拽放置的方式,方便用户按需选择和组合。另外,为了满足不同用户的需求,可以设置不同的界面模式,如简易模式和专业模式,让用户可以根据自己的技术水平和需要选择不同的界面风格。 在可视化用户界面设计中,还需要考虑图像显示和编辑的布局和操作方式。可以设计一个图像预览区,让用户可以实时查看处理后的图像效果,并提供一些基本的编辑工具,如裁剪、旋转和调整亮度对比度等,使用户可以直观地进行图像的处理和修改。此外,通过友好的交互式设计,帮助用户更直观地了解和操作各种图像处理算法和工具,比如拖动滑块来调整参数、添加实时的视觉反馈等。最后,考虑到Matlab GUI的动态性,可以设计一些动画或特效来增加用户界面的趣味性和吸引力。 综上所述,基于Matlab GUI的图像处理系统的可视化用户界面设计需要关注用户友好性和功能性的结合,提供简洁清晰的界面布局、丰富的功能模块和直观的图像操作方式,以满足用户的个性化需求和使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值