前言

本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。

iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。

本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。

环境配置

系统:window10

平台:visual studio code

语言:rust

库:iced 0.13

iced布局简介

iced中用于布局的部件有column、row等,我们在之前的博文里的示例代码中,就使用了column布局,也就是纵向排列的布局。同样,顾名思义,row即是横向布局。

二者可以嵌套使用,形成纵、横布局。

1、column布局

在iced中的定义就是:

//! Distribute content vertically.

创建一个column布局有几种方式,在我们前文的示例中,使用了column!这样的方式,这是一个快捷的方式,属于iced官方定义的一个宏macro:

官方源码
#[macro_export]
macro_rules! column {
() => (
$crate::Column::new()
);
($($x:expr),+ $(,)?) => (
$crate::Column::with_children([$($crate::core::Element::from($x)),+])
);
}

这个宏可以直接创建一个Column实例,也可以根据传入的子项来创建Column实例。

以前文代码为例:

column![
button("增加Inc").on_press(Message::Inc),
text(self.count).size(20),
button("减少Dec").on_press(Message::Dec)
]

此处,我们创建了一个column,并在其中添加了两个按钮和一个text,它们将在窗口呈纵向排列,我们可以通过设置column的spacing属性来调整其中元素之间的间隙。



将spacing设置为10:

我们可以来看一下Column的官方结构体定义:

官方源码
pub struct Column<'a, Message, Theme = crate::Theme, Renderer = crate::Renderer>
{
spacing: f32,
padding: Padding,
width: Length,
height: Length,
max_width: f32,
align: Alignment,
clip: bool,
children: Vec<Element<'a, Message, Theme, Renderer>>,
}

可以看到,其参数中,大部分是属性设置,其中children用于设置传入的子元素,也就是你希望在当前窗口某部分程序纵向排列的子元素,可以是任何widget,也可以嵌套布局,如column、row。

比如,我们将前文的按钮、文本的布局设为row,然后再嵌入到column中:

let row1=row![
button("增加Inc").on_press(Message::Inc),
text(self.count).size(20),
button("减少Dec").on_press(Message::Dec)
].spacing(10).padding(20);
column![
row1,
].spacing(10).padding(20)
.align_x(iced::Center)
.into()

看下效果:



我们多增加一些部件和嵌套:

let row1=row![
button("增加Inc").on_press(Message::Inc).width(60),
text(self.count).size(20),
button("减少Dec").on_press(Message::Dec).width(60)
].spacing(10).padding(20).width(200).height(100);
let col1=column![
button("col1").width(60).on_press(Message::None),
text("col1").size(12),
button("col1").width(60).on_press(Message::None),
].spacing(10).padding(5); let color1=iced::Color::from_rgba(155.0,0.0,0.0,255.0);
let cont_row=container(col1)
.style(move |t|styles::mycontainerstyle(t,color1))
.width(100).height(200)
.align_x(iced::Center).align_y(iced::Center);
let col2=column![
text("col2").size(12),
];
let color2=iced::Color::from_rgba(0.0,155.0,0.0,255.0);
let cont_row2=container(col2)
.style(move |t|styles::mycontainerstyle(t,color2))
.width(100).height(200)
.align_x(iced::Center).align_y(iced::Center);
let col3=column![
text("col3").size(12),
];
let color3=iced::Color::from_rgba(0.0,0.0,155.0,255.0);
let cont_row3=container(col3)
.style(move |t|styles::mycontainerstyle(t,color3))
.width(100).height(200)
.align_x(iced::Center).align_y(iced::Center);
let row_col=row![
cont_row,cont_row2,cont_row3
].spacing(10).padding(20).height(200);
column![
row1,
row_col,
].spacing(10).padding(20)
.align_x(iced::Center)
.into()

仔细看一下上面的代码,我们在原先的基础上,添加嵌套布局,总体布局是纵向,纵向有两层,第一层是原先的部件,第二层我们又嵌套了横向布局,一共三列,每一列又嵌套了纵向,为了显示区别,我们添加了背景色,其中关于style的使用,本文不做赘述。

看一下效果:



注意图片中的红黄蓝区域,此处我使用了container部件,方便设置背景色,以作区别。

当然,上面的布局看起来可能不是很整齐,但是实现的效果是对的,即column和row的嵌套来实现页面的布局,可以通过设置spacing和padding来微调部件的位置。

下面,我调整一下代码,为了使布局看起来更简洁有效,我们将显示一个按钮九宫格布局,那么就是三列或者三行互相嵌套,而且其中的子元素都是按钮,且居中排布。

先修改一下代码:

let col1=column![
button(text("col1_1").size(15)).width(80).height(40).on_press(Message::None),
button(text("col1_2").size(15)).width(80).height(40).on_press(Message::None),
button(text("col1_3").size(15)).width(80).height(40).on_press(Message::None),
].spacing(10); // let color1=iced::Color::from_rgba(155.0,0.0,0.0,255.0);
// let cont_row=container(col1)
// .style(move |t|styles::mycontainerstyle(t,color1))
// .width(100).height(200)
// .align_x(iced::Center).align_y(iced::Center);
let col2=column![
button(text("col2_1").size(15)).width(80).height(40).on_press(Message::None),
button(text("col2_2").size(15)).width(80).height(40).on_press(Message::None),
button(text("col2_3").size(15)).width(80).height(40).on_press(Message::None),
].spacing(10);
// let color2=iced::Color::from_rgba(0.0,155.0,0.0,255.0);
// let cont_row2=container(col2)
// .style(move |t|styles::mycontainerstyle(t,color2))
// .width(100).height(200)
// .align_x(iced::Center).align_y(iced::Center);
let col3=column![
button(text("col3_1").size(15)).width(80).height(40).on_press(Message::None),
button(text("col3_2").size(15)).width(80).height(40).on_press(Message::None),
button(text("col3_3").size(15)).width(80).height(40).on_press(Message::None),
].spacing(10);
// let color3=iced::Color::from_rgba(0.0,0.0,155.0,255.0);
// let cont_row3=container(col3)
// .style(move |t|styles::mycontainerstyle(t,color3))
// .width(100).height(200)
// .align_x(iced::Center).align_y(iced::Center);
let row_col=row![
col1,col2,col3
].spacing(10).padding(2).align_y(iced::Center);
// column![
// //row1,
// row_col,
// ].spacing(10).padding(20)
// .width(300).height(300)
// .align_x(iced::Center)
// .into()
let cont=container(row_col)
.align_x(iced::Center).align_y(iced::Center)
.width(300).height(300);
cont.into()

上面的布局,有一些代码是之前的代码,但是被注释了,不用管它,我们只关注有效代码,修改后的代码显示的效果如下;

2、row布局

row布局与column布局是完全一样的,除了布局方向,所以就不再赘述了。

3、综述

column和row是iced中常见的布局,但是并不是唯一,iced还有其他可以实现布局的方式,但本文不再赘述,将在后续逐渐展开。

综合本文上述的介绍,哪怕只是使用column和row,经过调整之后,也是能做出比较好看的布局的,当然以上只涉及了布局,还没有仔细去设置样式,包括边框、颜色、阴影等这些样式,这些都将在后续博文中介绍。

[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(01):为窗口设置布局(column、row)的更多相关文章

  1. [OpenCV实战]28 基于OpenCV的GUI库cvui

    目录 1 cvui的使用 1.1 如何在您的应用程序中添加cvui 1.2 基本的"hello world"应用程序 2 更高级的应用 3 代码 4 参考 有很多很棒的GUI库,例 ...

  2. 新做的一个基于OPENGL的gui库

    #include <BGE/All> ,text);     button->setName(name);     button->setSize(Vector2f(,)); ...

  3. Python GUI库

    PyQT不错的,只是要小心,这个东西是GPL的,如果你要写商业程序需要购买商业版授权.另外PyGTK.wxPython都是不错的GUI库.Python自带了一个基于TkInter的GUI库,如果你不想 ...

  4. 8个免费实用的C++GUI库(转载)

      C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都是C++擅长的地方.C++ ...

  5. Python 图形 GUI 库 pyqtgraph

    原文  Python 图形 GUI 库 pyqtgraph pyqtgraph 是纯 Python 图形 GUI 库,基于PyQT4 /pyside和NumPy.它主要目的用于在数学/科学/工程中.M ...

  6. 8个免费实用的C++GUI库

    8个免费实用的C++GUI库 C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都 ...

  7. C/C++编程GUI库比较

    转自:http://blog.csdn.net/lostown/article/details/658654 最强的GUI库当属Qt,毕竟是商业化的东西,功能最完整,什么都好,包括类似java代码风格 ...

  8. 用PYTHON首选的GUI库WXPYTHON做程序界面

    大家好,我是A8U神经网络,今天又要跟大家分享一下wxWidgets开发神经网络程序界面的一些经验,希望对开发有兴趣的朋友有所帮助.跨平台的GUI工具库以GTK +,Qt和wxWidgets闻名. G ...

  9. Qt和其它GUI库的对比

    http://c.biancheng.net/view/3876.html 世界上的 GUI 库多如牛毛,有的跨平台,有的专属于某个操作系统:有的只有 UI 功能,有的还融合了网络通信.多媒体处理.数 ...

  10. 8个必备的Python GUI库

    Python GUI 库有很多,下面给大家罗列常用的几种 GUI 库.下面介绍的这些GUI框架,能满足大部分开发人员的需要,你可以根据自己的需求,选择合适的GUI库. 很多人学习python,不知道从 ...

随机推荐

  1. DRF-Permission组件源码分析及改编源码

    1. 权限组件源码分析 PS:下列源码为了方便理解都进行了简化,只保留了权限相关的代码 由于视图函数中继承了APIView,因此permission_classes可在视图类中进行重写. 注意点: 执 ...

  2. Canvas简历编辑器-层级渲染与事件管理能力设计

    Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计.那么此时我们就依 ...

  3. SpringBoot项目集成MinIO

    一.MinIO的下载安装以及基本使用 1.下载地址:https://dl.min.io/server/minio/release/windows-amd64/minio.exe 2.下载好后需要手动创 ...

  4. 采用线性回归实现训练和预测(Python)

    已知测得某块地,当温度处于15至40度之间时,数得某块草地上小花朵的数量和温度值的数据如下表所示.现在要来找出这些数据中蕴含的规律,用来预测其它未测温度时的小花朵的数量. 测得数据如下图所示: imp ...

  5. 遗传算法+强化学习—TPG—Emergent Tangled Graph Representations for Atari Game Playing Agents

    最近在看进化算法在强化学习(RL)领域的一些应用,有些论文中将使用进化算法解决强化学习问题的算法归为非强化学习算法,然而又有些论文把使用进化算法解决强化学习问题的算法归为强化学习算法,不过更多的论文是 ...

  6. Nuxt.js 应用中的 vite:extendConfig 事件钩子详解

    title: Nuxt.js 应用中的 vite:extendConfig 事件钩子详解 date: 2024/11/12 updated: 2024/11/12 author: cmdragon e ...

  7. Reviewbot 开源 | 有些 git commit 记录真的不敢恭维, 我推荐每位工程师都常用 git rebase 和 git commit --amend

    Reviewbot 是七牛云开源的一个项目,旨在提供一个自托管的代码审查服务, 方便做 code review/静态检查, 以及自定义工程规范的落地. 在日常的编程协作中,Git commit 记录的 ...

  8. IPC-7711/7721D-中文版 CN 2024 电子组件的返工、修改和维修标准

    IPC-7711D-7721D-中文版 CN 2024 电子组件的返工.修改和维修标准 链接:https://pan.baidu.com/s/1r5dm9vsj4-Oj2Jw0HgeTHw?pwd=1 ...

  9. Ocelot集成Consul实现api网关与服务发现

    前言 没看dotnet微服务之API网关Ocelot的请先看,这篇文章接上面文章 安装consul #自定义网络,自定义网络可以指定容器IP,这样服务器重启consul集群也可以正常运行. docke ...

  10. python中的多继承理解

    在python的多继承中,父类的初始化顺序遵循所谓方法解析顺序(Method Resolution Order,MRO)的机制.python使用C3线性化算法来确定多继承类的MRO: 1. 目标:创建 ...