023_Layout_and_Containers_in_Matlab界面布局与容器

在这里插入图片描述

容器

基于uifigure进行的图形用户界面设计,可以分为以下几种容器类型:

  • 图窗:uifigure
  • 布局:uigridlayout
  • 面板:uipanel
  • 标签页:uitabgroupuitab

这几个对象除uifigure外相互可以形成嵌套的关系,从而构建出复杂的图形用户界面。每个对象都是一个函数,调用时可以指定父容器对象,从而将其添加到父容器中。布局、面板和标签页通用调用方式如下,xxxx可以替换为具体的对象名,如gridlayoutpaneltabgrouptab等。

h = uixxxx(contains, 'Property1', value1, 'Property2', value2, ...);

或者:

h = uixxxx('Property1', value1, 'Property2', value2, ...)

当然,采用Property=Value的形式也是可以的。

当不显式设置'contains'属性时,会自动将当前图窗作为父容器,当没有可用的图窗时,会自动创建一个图窗作为父容器。

当然,uigridlayout略有不同,还存在一个直接设定尺寸的方式:

h = uigridlayout(contains, [nrows, ncols], 'Property1', value1, 'Property2', value2, ...);

不同的容器对象,有不同的属性。

uifigure

uifigure是图形用户界面的根容器,是所有其他容器的父容器。uifigure的属性几类:

  • 外观
    • Color:背景颜色,可以是RGB三元组、十六进制颜色代码,或者颜色名称和简称。
    • WindowStyle:窗口样式,normal(默认)、modalalwaysontop
    • WindowState:窗口状态,normal(默认)、minimizedmaximizedfullscreen
  • 位置和大小
    • Position: 位置和大小,[left, bottom, width, height]
    • Units:单位,pixels(默认)、normalizedinchescentimeterspointscharacters
    • InnerPosition:内部位置和大小(不含边框、标题栏),[left, bottom, width, height]
    • Resize:是否可以调整大小,on(默认)、off, 逻辑值。
    • AutoResizeChildren:是否自动调整子对象大小,on(默认)、off
  • 绘图
    • ColorMap:颜色映射,[m, 3]大小的矩阵,每行为RGB三元组。
    • AlphaMap:透明度映射,64个[0, 1]之间的值构成的向量。
  • 鼠标指针
    • Pointer:鼠标指针,arrow(默认)、crosshairibeamwatch
    • PointerShapeCData:自定义鼠标指针,[16, 16][32, 32]大小的矩阵。
    • PointerShapeHotSpot:鼠标指针热点,[x, y]
  • 交互性
    • Visible: 是否可见,on(默认)、off
    • CurrentAxes:当前坐标轴。
    • CurrentObject:当前对象。
    • CurrentPoint:当前点。
    • CurrentCharacter:当前字符。
    • SelectionType:选择类型,normalextendaltopen
    • Scrollable:是否可滚动,onoff(默认)。
    • ContextMenu:上下文菜单,ContextMenu对象。
  • 常见回调函数
  • 键盘动作回调函数
  • 窗口状态回调函数
  • 执行控制回调函数
  • 父子关系
    • contains:父容器。
    • Children:子对象。
    • HandleVisibility:句柄可见性,oncallbackoff(默认)。
  • 标识符和名称
    • Name:名称,字符串。
    • Icon:图标,字符串、图像对象。
    • Number:数字,整数。
    • NumberTitle:是否显示数字标题,onoff(默认)。
    • IntegerHandle:整数句柄,onoff(默认)。
    • Type:类型,字符串, figure
    • Tag:标识符,字符串。
    • UserData:用户数据,任意数组。

回调函数先放一放,其他属性里面比较有意思的是HandleVisibility,默认是off,这意味着图形对象的句柄是不可见的,这样可以防止用户直接操作图形对象,但是可以通过findobj等函数找到对象。

主要是Matlab中非常多的函数,在需要图形窗体或者坐标轴的时候会自动调用gcfgca来获得默认的句柄,如果HandleVisibilityoff,那么这些函数就不会干扰App中的图形对象。

on意味着句柄可见,callback意味着只有回调函数可以找到对象。

其他属性都非常直白,不再赘述。

uigridlayout

Matlab跟别的GUI库不一样的是,它的布局只有一个网格布局,通过网格布局,很容易实现VBoxHBox,只需要把对应的行、列设为1就可以。

容器、控件通过Parent属性指定父容器,Children属性获得子对象,形成一个树状结构。

虽然,uifigure可以直接包含uipaneluitabgroup,并且当一个App只有一个容器时或许可以这么做的,当多个容器或者控件直接添加到uifigure时,就会重叠起来,后添加的显示在前面。

一般而言,还是保持清爽,uifigure包含uigridlayoutuigridlayout包含uipaneluitabgroupuitabgroup包含uitab.

当然,我们可以看到uipaneluitab可以嵌套容纳uifigure之外的所有容器,包含uipaneluigridlayoutuitabgroup

为了简便,我们还可以确定一个原则,两个叶子节点容器(uitabuipanel),也尽量应该首先添加uigridlayout,然后再包含下级的容器。

contains
contains
contains
contains
contains
contains
contains
uifigure
uigridlayout
uipanel
uitabgroup
其它控件
uitab
uigridlayout
uigridlayout

uigridlayout属性

最重要几个属性是RowHeightColumnWidthPaddingRowSpacing/ColumnSpacing主要是设置其中的子控件/容器的位置和大小。其中行和列尺寸有一个特定的语法来设置。

  • fit:自适应大小。
  • 1x,2x等:自动适应,按比例分配剩余空间。
  • 数字:固定大小。

Padding是内边距,RowSpacing/ColumnSpacing是间距。

例如:

g = uigridlayout(contains, [2, 3], 'RowHeight', {'1x', 100}, 'ColumnWidth', {100, '1x', '2x'}, 'Padding', [5, 5], 'Spacing', 5);

这是一个2x2的布局,第一行高度自适应,第二行高度100,第一列宽度100,第二、三两列宽度自适应,第三列宽度是第二列的两倍,内边距5,间距5。

之后的控件或者容器添加到这个布局中,会按照这个布局来排列。容器和空间的属性Layout可以用于设置在布局中的位置。

p = uipanel(g, 'Title', 'My Panel', 'BackgroundColor', 'red');
p.Layout.Row = 1;
p.Layout.Column = 2;

uipanel

uipanel是一个面板容器,可以包含其他控件,可以设置标题、背景颜色等。

uitabgroupuitab

uitabgroup是一个标签页容器,可以包含多个uitab,每个uitab可以包含其他控件。

uitab有一个Title属性,可以设置标签页的标题。

f = uifigure('Name', 'My App', 'Position', [100, 100, 640, 480]);
g = uigridlayout(f, [2, 3], 'RowHeight', {'1x', 100}, 'ColumnWidth', {100, '1x', '2x'}, 'Padding', [5, 5], 'Spacing', 5);
p = uipanel(g, 'Title', 'My Panel', 'BackgroundColor', 'red');
tg = uitabgroup(g);
t1 = uitab(tg, 'Title', 'Tab 1');
t2 = uitab(tg, 'Title', 'Tab 2');

助兴小例子

下面我们来实现一个很简单的vbox

function [g, children] = vbox(parent, items,  varargin)
% items: cell array of Name, args pairs
% varargin: additional arguments to uigridlayout
n = length(items);
children = gobjects(1, n);

g = uigridlayout(parent, [1, n], varargin{:});

if ~nameInArgs('RowHeight', varargin)
    g.RowHeight = {'1x'};
end
if ~nameInArgs('ColumnWidth', varargin)
    g.ColumnWidth = repmat({'1x'}, 1, n);
end

for i = 1:n
    itemName = items{i, 1};
    itemArgs = items{i, 2};
    children(i) = feval(itemName, g, itemArgs{:});
    children(i).Layout.Row = 1;
    children(i).Layout.Column = i;
end

    function isIn = nameInArgs(name, args)
        isIn = false;
        for j = 1:2:length(args)
            if strcmp(args{i}, name)
                isIn = true;
            end
        end
    end

end

通过这个函数,我们就可以进行下面的调用:

% vbox-tutor

f = uifigure('Name', 'My App', 'Position', [100, 100, 640, 480]);

g = uigridlayout(f, [2,2], 'RowHeight', {"1x", "1x"}, 'ColumnWidth', {'1x', '1x'});

[v1, children] = vbox(g, ...
    {'uipanel', {'Title', 'Panel 1', 'BackgroundColor', 'red'}; ...
    'uipanel', {'Title', 'Panel 2', 'BackgroundColor', 'blue'}}, ...
    'RowHeight', {100}, 'Padding', 5,  'ColumnSpacing', 15, 'BackgroundColor', [0.8, 0.8, 0.8]);

v1.Layout.Row = 1;
v1.Layout.Column = 1;

[v2, children2] = vbox(g, ...
    {'uipanel', {'Title', 'Panel 3', 'BackgroundColor', 'green'}; ...
    'uipanel', {'Title', 'Panel 4', 'BackgroundColor', 'yellow'}}, ...
    'RowHeight', {100}, 'Padding', 15,  'ColumnSpacing', 10, 'BackgroundColor', [0.6, 0.6, 0.6]);

v2.Layout.Row = 1;
v2.Layout.Column = 2;

[v3, children3] = vbox(g, ...
    {'uipanel', {'Title', 'Panel 3', 'BackgroundColor', 'green'}; ...
    'uipanel', {'Title', 'Panel 4', 'BackgroundColor', 'yellow'}}, ...
    'RowHeight', {100}, 'Padding', 25,  'ColumnSpacing', 5,  'BackgroundColor', [0.4, 0.4, 0.4]);
v3.Layout.Row = 2;
v3.Layout.Column = 1;

[v4, children4] = vbox(g, ...
    {'uipanel', {'Title', 'Panel 3', 'BackgroundColor', 'green'}; ...
    'uipanel', {'Title', 'Panel 4', 'BackgroundColor', 'yellow'}}, ...
    'RowHeight', {100}, 'Padding', 35,  'ColumnSpacing', 0, 'BackgroundColor', [0.2, 0.2, 0.2]);
v4.Layout.Row = 2;
v4.Layout.Column = 2;

要把App的界面输出位图像,可以使用exportapp函数。

exportapp(f, 'vbox.png');

从这个例子里面,也可以很容易看出来,PaddingSpacing的区别,Padding子节点与父节点相对位置的描述,Spacing是子节点之间的间隙。

在这里插入图片描述

当然,增加hbox可以作为一个小练习。

总结

  1. uifigure是根容器,其他容器都是它的子容器,通过设置句柄不可见,可以防止gcfgcaclose等函数对App的影响。
  2. uigridlayout是唯一的布局容器,通过设置行高、列宽、内边距、间距,可以很容易实现VBoxHBox
  3. uipanel是一个面板容器,可以包含其他控件,可以设置标题、背景颜色等。
  4. uitabgroupuitab是标签页容器,可以包含多个uitab,每个uitab可以包含其他控件。

敬请收藏:windtunnel.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/894491.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解TypeScript模块-声明-配置

目录 模块化内置类型导入命名空间类型查找内置类型外部定义声明第三方库自定义声明 tsconfig.json文件在Vue项目中应用在React项目中应用 模块化 在TypeScript中最主要使用的模块化方案就是ES Module,先理解 TypeScript 认为什么是一个模块: JavaScript…

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b CogVideoX-2b 模型介绍发布时间模型测试生成的demo视频生成视频限制 运行环境安装运行模型下载开源协议参考 CogVideoX-2b 模型介绍 CogVideoX是 清影 同源的开源版本视频生成模型。 基础信息: 发布时间 2…

VScode远程服务器进行开发(三)

VScode远程服务器进行开发(三) 1、配置你的~/.ssh/config文件 在家目录中配置 ~/.ssh/config 文件,没有配置过的同学可以自行百度,基本上就是远程服务器的罗列; 同时,在你安装了 Remote Development 后&…

群晖使用Docker搭建NASTool自动化观影工具并实现在线远程管理

文章目录 前言1. 本地搭建Nastool2. nastool基础设置3. 群晖NAS安装内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要分享一下如何在群晖NAS中本地部署Nastool,并结合cpolar内网穿透工具,轻松实现公网环境远程管理与访问本地NAS中储存的影…

“网络协议入门:HTTP通信的四大组成部分“

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词: 春水满四泽,夏云多奇峰🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微…

大话设计模式解读07-模板方法

上篇文章,介绍了《大话设计模式》的第9章——原型模式。 本篇,来介绍《大话设计模式》的第10章——模板方法。并通过C代码实现实例代码的功能。 1 模板方法 模板方法模式(TemplateMethod):定义一个操作中的算法的骨架…

【简单版】通过 Window.performance 实现前端页面(性能)监控

1 背景 前端监控系统告警xx接口fetchError 问题:前端监控系统没有更多的错误信息,查询该fetch请求对应的接口日志返回200状态码、无请求异常记录,且后台能查到通过该fetch请求成功发送的数据。那是前端页面的错误还是前端监控系统的问题&…

如何轻松使用pip安装Git仓库中的私有Python模块(使用pip和Git仓库发布和安装私有Python模块)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Git模块 📒📝 Git仓库要求🔖 项目目录结构🔖 文件说明📝 编写setup.py📝 配置MANIFEST.in📝 推送代码到Git仓库📝 使用pip安装模块🔖 使用用户名和密码🔖 使用Personal Access Token (PAT)🔖 示例📝 更…

基于SpringBoot的在线数据平台设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Apache Lucene 10 已发布!Lucene 硬件效率改进及其他改进

作者:来自 Elastic Adrien Grand Apache Lucene 10 刚刚发布,重点关注硬件效率!查看主要版本亮点。 Apache Lucene 10 终于发布了!自 Lucene 9.0(于 2021 年 12 月发布,距今已有近 3 年)以来&a…

Faster RCNN

经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classificati…

医疗领域的RAG技术:如何通过知识图谱提升准确性

在医学领域,准确的信息检索和处理至关重要。随着大型语言模型(LLMs)的兴起,检索增强生成(RAG)技术在医学信息处理中的应用越来越受到关注。本文将探讨RAG技术在医学领域的应用,特别是如何利用知…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…

潮流头像社 1.1 | 打造个性化专属头像的设计工具。

潮流头像社提供了丰富多样的头像制作工具和素材,让用户可以尽情地展示自己的独特魅力。无论是想要换脸特效、滤镜、贴纸、文字还是配饰,用户都可以在这里找到自己喜欢的元素,并且将其融合到自己的头像设计中,创造出一个独一无二的…

87. 多边形轮廓Shape(圆弧)

先掌握上节课关于Shape内容,再继续学习本节课关于Shape圆弧的介绍。 圆弧方法.arc() 圆弧方法.arc()使用方式和原来学习过的圆弧曲线ArcCurve整体相似,区别在于圆心定位方式有差异。 圆弧.arc()参数的圆心坐标是相对当前.currentPoint而言,而不是坐标原…

MFC工控项目实例二十五多媒体定时计时器

承接专栏《MFC工控项目实例二十四模拟量校正值输入》 用多媒体定时器实现0.1秒计时器 1、在SEAL_PRESSUREDlg.h文件中添加代码 #include<MMSystem.h> #pragma comment(lib,"winmm.lib")class CSEAL_PRESSUREDlg : public CDialog { public:CSEAL_PRESSUREDlg(…

【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

模板 算法原理 做动态规划的题目&#xff0c;一般会先创建一个一维数组 dp&#xff0c;称之为 dp表我们想办法填满这个 dp表&#xff0c;里面的某个值就是最终结果 采用动态规划&#xff0c;一般分五步&#xff1a; 状态表示 是什么&#xff1f; dp 表中每一个值所表示的含义…

王爽汇编语言第三版实验3

实验任务 将下面的程序保存为t1.asm&#xff0c;将其生成可执行文件t1.exe 用Vscode编写源程序t1.asm 用脚本一键生成可执行文件t1.exe 成功运行 查看资源管理器&#xff0c;成功生成T1.obj与t1.exe文件‘ 用debug跟踪t1.exe的执行过程&#xff0c;写出每一步执行后&#xff…

基于SSM的大学校医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着高校规模的不断扩大和师生健康意识的增强&#xff0c;大学校医院面临着日益增长的医疗服务需求。传统的纸质病历、手工预约和药品管理方式已难以满足高效、准确和便捷的服务要求。因此&#xff0c;开发一套基于SSM&#xff…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…