023_Layout_and_Containers_in_Matlab界面布局与容器

news2024/11/29 10:33:00

在这里插入图片描述

容器

基于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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【新人系列】Python 入门(二):Python IDE 介绍

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…

leetcode.204.计数质数

#中等#枚举 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 埃氏筛 枚举没有考虑到数与数的关联性,因此难以再继续优化时间复杂度。接下来我们介绍一个常见的算法,该算法由希腊数学家厄拉多塞(Eratosthenes)提…

Python爬虫:自动化获取商品评论数据

为什么选择Python爬虫API 高效的数据处理:Python的数据处理能力,结合Pandas等库,可以轻松处理和分析大量的评论数据。丰富的库支持:Python拥有丰富的库,如requests用于发送HTTP请求,BeautifulSoup用于解析…

初识MySQL · 数据库

目录 前言: 数据库 简单使用 存储引擎 前言: 本文也是MySQL的第一篇文章了,新的知识点已经出现,怎么能够停止不前,穿越时空……(迪迦奥特曼乱入哈哈哈)。 言归正传,我们在本文的目标有: …

工厂生成中关于WiFi的一些问题

一 背景: 主要做高通和MTK,工厂生成中通过使用adb wifi,因为这样生产效率高并且避免了新机器有划痕,但是也经常碰到adb wifi无法连接的问题,那么是什么原因导致呢? 二 案例 测试步骤: 使用adb wifi连接手机测试工厂case adb usb adb tcpip 5555 adb connect DU…

高效监控系统:Nightingale本地化部署与远程访问指南

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 本文主要介绍如何在本地Linux系统部署 Nightingale 夜莺监控并结合cpolar内网穿透工具实现远程…

Android组件化、模块化、Catalogs

前言 下载代码-----》码云下载 下载代码-----》github下载 本篇是Android最新的依赖架构设计,gradle版本要8.0以上,代码实现基于8.5.1。好多年开发过程中,我们碰到config.gradle,buildSrc,composing builds等依赖编译…

新款任天堂switch游戏机方案,支持4K60HZ投屏方案,显示器,手柄方案

据传任天堂将推出新的一代的switch掌机,而新款掌机将支持4K60HZ投屏 都2402年了再做1080P确实有点不太象话了 4K60HZ相较于1080P能够提升很多游戏体验,这时不管是HDMI显示器或者是VR眼睛清晰度都会让人舒服很多。 不过新一代的任天堂似乎也在PD协议上…

用作曲的手法写旋律 什么是动机 ​动机扩大 单音重复 移八度

【你怎么还不会写旋律!!!猴子都听的懂的旋律教程来了!两分钟让你快速上手!】 你怎么还不会写旋律!!!猴子都听的懂的旋律教程来了!两分钟让你快速上手!_哔哩哔…

同济子豪兄--图的基本表示【斯坦福CS224W图机器学习】

无向图(Undirected Graph): 在无向图中,边没有方向,即如果顶点A和顶点B之间有一条边,那么这条边既表示A到B的关系,也表示B到A的关系。换句话说,边是双向的。无向图的边通常用一条线段…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统,是一个支持前后端分离设计的 客户端(C/S)项目,该示例项目前端xaml使用UI库 ,Material Design Themes UI 来构建用户界面,确保…

Ubuntu如何显示pcl版本

终端输入: apt-cache show libpcl-dev可以看到,Ubuntu20.04,下载的pcl,应该都是1.10版本的

一次性入门三款分布式定时任务调度框架:Quartz、ElasticJob3.0、xxl-job

分布式定时任务调度框架(文末有源码) 前言1、Quartz1.1 数据库1.2 maven依赖1.3 代码实现1.3.1 创建一个job1.3.1 为job设置trigger 1.4 配置文件1.5 启动、测试1.1 单机1.2 集群 2、ElasticJob2.1 下载zk2.2 新建三个类型的作业2.3 配置文件2.4 启动项目…

Windows下配置Nginx和PHP

之前在Windows开发php项目用的是phpstudy,好用的很。但是phpstudy好久没有更新了,感觉PHP像没有人再用了一样。但是PHP拿来开发小系统,还是很高效的,今天记录如何在Windows环境下配置Nginx和PHP。 1. 配置nginx Nginx软件下载解压…

基于Springboot+Vue的宠物管理系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

实现双向链表的增删改查

头文件 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next; } LTNode; //v…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …

ParallelsDesktop20最新版本虚拟机 一键切换系统 游戏娱乐两不误

让工作生活更高效&#xff1a;Parallels Desktop 20最新版本虚拟机的神奇之处 大家好&#xff01;&#x1f44b; 今天我要跟大家安利一款让我工作效率飞升的神器——Parallels Desktop 20最新版本虚拟机。作为一个日常需要在不同操作系统间来回穿梭的人&#xff0c;这款软件简直…

react18中的计算属性及useMemo的性能优化技巧

react18里面的计算属性和使用useMemo来提升组件性能的方法 计算属性 实现效果 代码实现 函数式组件极简洁的实现&#xff0c;就这样 import { useState } from "react"; function FullName() {const [firstName, setFirstName] useState("");const [la…