- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。 iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。 本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等.
环境配置 系统:window10 平台:visual studio code 语言:rust 库:iced 0.13 。
iced中用于布局的部件有column、row等,我们在之前的博文里的示例代码中,就使用了column布局,也就是纵向排列的布局。同样,顾名思义,row即是横向布局。 二者可以嵌套使用,形成纵、横布局.
在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()
上面的布局,有一些代码是之前的代码,但是被注释了,不用管它,我们只关注有效代码,修改后的代码显示的效果如下,
row布局与column布局是完全一样的,除了布局方向,所以就不再赘述了.
column和row是iced中常见的布局,但是并不是唯一,iced还有其他可以实现布局的方式,但本文不再赘述,将在后续逐渐展开。 综合本文上述的介绍,哪怕只是使用column和row,经过调整之后,也是能做出比较好看的布局的,当然以上只涉及了布局,还没有仔细去设置样式,包括边框、颜色、阴影等这些样式,这些都将在后续博文中介绍.
最后此篇关于[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(01):为窗口设置布局(column、row)的文章就讲到这里了,如果你想了解更多关于[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(01):为窗口设置布局(column、row)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个无 GUI 的服务器(没有任何桌面环境或 Ubuntu 服务器的新鲜 Debian,没有 X 服务器,先验)。 我考虑安装 docker 并拉取一个基于官方 Ubuntu 的容器,并在其上添加
我正在构建一个带有临时用户名系统的简单聊天服务器。当屏幕弹出时,首先会出现一个简单的屏幕,询问您的用户名。你可以放入任何你想要的东西,这纯粹是暂时的(我也在尝试)。代码告诉程序继续,将用户名保存到代码
我想将来自其他类的图像显示到 QLabel 中,但要通知 GUI 有一个新的框架可用。我需要从非 GUI 类和非 GUI 线程发出信号。 有什么办法吗? 最佳答案 signal 可以从任何继承QObj
我正在用 Java 编写一个图形用户界面,它有一些按钮,其中一个按钮是选项。我想要它,所以当您单击选项时,它会将 gui 更改为我的选项 gui,而不是在另一个窗口中打开它。 我该怎么做? 最佳答案
标题说明了一切...我和我的 friend 正在这样做,我们不知道为什么 Ball.java 实际上没有在 gamePanel 中制作球,然后制作 GUI。顺便说一句,这是 8 球台球。这是代码: 驱
我正在使用 GUI 构建器,我想知道是否有一种简单的方法可以通过当前主窗口打开寄存器窗口(引用下面的页面)。我正在尝试通过菜单栏来执行此操作。 我一整天都在尝试,因为 GUI Builder 生成了一
我有一个程序使用了许多隐藏的 GUI 组件。例如,所有菜单项和打印机对话框/组件(仅占用至少 50 毫秒)。总的来说,我猜整个程序启动的大约 300 毫秒(或 40%)要归功于所有隐藏的东西。 我想做
我对 GUI 构建比较陌生。 我想制作一个带有按钮(我已经有了)的 GUI,用户可以按下该按钮并选择一个图像,然后动态地将该图像加载到面板中的 GUI 中。我希望每次用户浏览图像时图像都动态变化。 到
我有两年使用 Java 和 Visual Studio 进行企业应用程序编程的经验,而且我是 Python 和 wxPython 的新手。所以我的问题是:wxPython 能否为我提供足够丰富的 GU
这是我启动 mkvtoolnix-gui 时遇到的错误: mkvtoolnix-gui: symbol lookup error: mkvtoolnix-gui: undefined symbol:
我在初始屏幕上有一些最近使用的存储库,我想删除它们,因为我不再使用它们了。如何删除它们? 操作系统 = Windows 7 我查看了注册表并搜索了 git 目录,但找不到最近使用列表的存储位置。 最佳
我正在尝试在 matlab、GUI 中用户输入点作为输入和它们之间的连接。 我有 5 个 matlab 文件 - screen1.m、screen2.m、screen3.m、screen4.m、glo
我用java制作了一个客户端/服务器程序,我已经按照我想要的方式使用cmd完美地工作了,现在我正在尝试将代码的客户端转换为GUI,但是我在打印时遇到问题客户端消息并从文本字段和服务器消息读取客户端输入
我正在制作一种 CRUD 应用程序(Java GUI,MYSQL)我应该: 将数据从数据库加载到List(例如),然后将List加载到GUI 将数据从数据库加载到对象(具有 SQL 表等属性)和对象到
我正在开发一个有 5 个图形用户界面窗口的 Java 应用程序,其中一个是问候窗口或主窗口,我已经完成了所有逻辑部分的工作,我已经完成了 99.99%,唯一剩下的就是我如何以这种方式编码,当我点击一个
我目前正在开发 GUI。 我选择将我的 GUI 基于 bluej 项目 - Scribble。 当您创建 ScribbleGUI 对象时,DrawDemo 类会创建一个同时自动打开的 Canvas 。
在这里阅读了很多关于多进程、管道等的内容后,我还没有找到答案,但如果它已经存在,我深表歉意。 我有一个外围硬件,我正在尝试为其创建一个 GUI。我想让 GUI 使用来自外围设备的数据不断更新,同时仍保
我想做的是将 GUI 从一个单独文件中的类链接到另一个类。我的第一个类是一个主菜单,它将显示一些链接到另一个窗口的按钮。第二个类显示不同的窗口,但我现在遇到的问题是我不知道如何链接第一个类中的按钮来调
我的 GUI 代码中有一个奇怪的行为。如果用户在短时间内产生大量事件,则可能会发生正在运行的事件处理程序方法被另一个事件处理程序方法中断。由于一切都在同一个线程(GUI 线程)中运行,所以一切都应该按
这是一个涉及风格的问题。我正在寻找可以帮助我解决常见 GUI 设计问题 的想法。该应用程序是在 Winforms 中完成的,宁愿使用 WPF,该应用程序已经完成,但我是一个完美主义者,在与其他人合作时
我是一名优秀的程序员,十分优秀!