[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(06):基于iced实现一个简单的图片浏览器
前言
本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。
iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。
本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。
环境配置
系统:window10
平台:visual studio code
语言:rust
库:iced 0.13
扩展库:iced_aw
概述
图片浏览器的实现,我们的设想是可以通过文件夹导入所有图片,然后获取的图片在界面上排布显示,其中有一个是主图片,其他图片以缩略图形式在下方,可以通过按钮切换图片的显示。
前提条件
为了实现文件夹导入,需要添加一个对话框库,即RFD:
1、新建iced项目
关于如何新建iced窗口并设置窗口参数,可以参考博文:
基于rust的GUI库iced的学习(00):一个典型的iced窗口的实现
本文不再赘述。
本文的目的是创建一个能够导入图片并进行浏览的窗口,所以我们需要先添加以下模块:
rfd = "0.15.2"
image = "0.25.5"
我们的窗口基本布局如下:
如图,通过导入文件夹按钮导入图片文件夹,获取了图片列表后,在窗口动态添加并显示,而上一张和下一张按钮则可以切换图片的显示。
我们先来看view函数的基本布局:
let img_main_h=image::Handle::from_path(&self.img_main_p);
//let img_main= image(self.handle.clone());
let img_main = image(img_main_h).width(300).height(300)
.content_fit(iced::ContentFit::Contain);
let img_sub_view = self.updateview();
let cont1=container(
column![
row![
//button(text("打开").size(20)).width(80).on_press(Message::Open),
button(text("导入文件夹").size(14)).width(100).on_press(Message::OpenFolder),
],
row![
button(text("上一张").size(14)).width(100).on_press(Message::Last),
button(text("下一张").size(14)).width(100).on_press(Message::Next),
].spacing(10),
img_main,
img_sub_view,
].padding(10).spacing(10).align_x(Center)
).align_x(Center)
.align_y(Center)
.width(iced::Length::Fill).height(iced::Length::Fill)
.style(|t| styles::mycontainerstyle(t));
cont1.into()
上面的代码中,updateview函数如下:
fn updateview(&self) ->Column<Message>{
let row1 = match self.imgs.len() {
0 => Self::contcont("无图片"),
n => {
//println!("图片数量:{}",n);
let mut row1 = row![].spacing(20);
for i in 0..n {
row1 = row1.push(
container(
image(image::Handle::from_path(self.imgs[i].display().to_string())).width(100).height(100)
).style(move |t| styles::mycontainerstyle_border(t,i.to_string(),self.current_index))
);
};
Self::contcont("图片列表").push(row1)
},
};
row1
}
为什么要使用这个函数,主要目的是为了动态添加图片元素,这个函数会根据获取的图片数量,生成相应的image元素并显示在窗口(如果图片太多则会非常卡,本文未作优化)。
2、文件夹导入和遍历
在iced中,文件夹导入,我们使用rfd库来创建对话框:
if let Some(folder) = FileDialog::new()
.set_directory("E:\\100rust2\\iced-img")
.set_title("打开文件夹")
.pick_folder() {
println!("打开文件夹: {:?}", folder);
let paths = folderbrowser(folder).unwrap();
if paths.len() > 0 {
self.imgs.clear();
self.current_index = 0;
for path in paths {
println!("文件夹中的文件: {:?}", path);
self.imgs.push(path);
};
self.img_main_p = self.imgs[self.current_index].display().to_string();
} else {
MessageDialog::new()
.set_title("提示")
.set_description("文件夹中无图片文件!")
.show();
println!("文件夹为空");
}
}
注意到,我们获取了文件夹的路径后,使用folderbrowser函数进行了遍历:
///
///遍历文件夹
///
pub fn folderbrowser(path:std::path::PathBuf) ->Result<Vec<std::path::PathBuf>,String> {
match std::fs::read_dir(path) {
Ok(dirs) => {
let paths = dirs.filter_map(
|dir| {
dir.ok().map(|dir_dir| dir_dir.path())
.filter(|path| {
if let Some(ext) = path.extension() {
ext == "png" || ext == "jpg" || ext == "webp" || ext == "bmp" || ext == "jpeg"
} else {
false
}
})
}
).collect();
Ok(paths)
},
Err(e) =>{
Err(format!("Error:{}",e))
}
}
}
如上,我们使用rust的标准库std的fs来处理文件路径,将文件夹中的每个图片路径都提取出来,而不符合图片后缀名的文件,则忽略。
3、样式实现
注意上述图片红色箭头所指,当前主图片对应的缩略图,其边框是与其他边框不一样的,如果是在前端项目中,实现这样的效果是非常简单的,而在iced中,如果我们希望实现这样的效果,就需要为图片进行自定义样式的设置。
在iced中,image元素本身是没有样式设置的,因此,我们的处理办法是在image元素外面套一层container元素:
container(
image(image::Handle::from_path(self.imgs[i].display().to_string())).width(100).height(100)
).style(move |t| styles::mycontainerstyle_border(t,i.to_string(),self.current_index))
针对于container元素,我们就可以设置其style参数,具体来说,对于缩略图的图片,我们为其添加了一层套壳,通过设置套壳的样式来展现区别。
我们新建一个styles.rs文件,在其中添加mycontainerstyle_border函数:
pub fn mycontainerstyle_border(t:&Theme,s:String,index:usize) ->iced::widget::container::Style {
if s == index.to_string() {
iced::widget::container::Style {
border:iced::Border{
color:iced::color!(0x669EF1), //#669EF1FF
width:3.0,
radius:iced::border::Radius::default(),
},
..Default::default()
}
} else {
iced::widget::container::Style {
border:iced::Border{
color:Color::BLACK,
width:1.0,
radius:iced::border::Radius::default(),
},
..Default::default()
}
}
}
注意看上面的代码,我们实现缩略图边框变化的方法是,通过比较当前主图片的索引与图片列表的索引,如果一致,则表示当前图片是主图片,则设置其边框为蓝色加粗,否则其边框为默认。
经过验证,这个方法是简单有效的。
4、动态演示
[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(06):基于iced实现一个简单的图片浏览器的更多相关文章
- [OpenCV实战]28 基于OpenCV的GUI库cvui
目录 1 cvui的使用 1.1 如何在您的应用程序中添加cvui 1.2 基本的"hello world"应用程序 2 更高级的应用 3 代码 4 参考 有很多很棒的GUI库,例 ...
- 新做的一个基于OPENGL的gui库
#include <BGE/All> ,text); button->setName(name); button->setSize(Vector2f(,)); ...
- 基于jQuery的一个简单的图片查看器
项目中自己diy了一个图片查看器.因为初始代码不是自己的,只是在上面改了一下也没有弄的很漂亮.等以后有时间了在重写一下样式和封装,作为备用的只是积累吧.如果有童鞋有用到,完全可以在此基础上改,比较容易 ...
- Python GUI库
PyQT不错的,只是要小心,这个东西是GPL的,如果你要写商业程序需要购买商业版授权.另外PyGTK.wxPython都是不错的GUI库.Python自带了一个基于TkInter的GUI库,如果你不想 ...
- Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
- fastText一个库用于词表示的高效学习和句子分类
fastText fastText 是 Facebook 开发的一个用于高效学习单词呈现以及语句分类的开源库. 要求 fastText 使用 C++11 特性,因此需要一个对 C++11 支持良好的编 ...
- 8个免费实用的C++GUI库(转载)
C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都是C++擅长的地方.C++ ...
- Python 图形 GUI 库 pyqtgraph
原文 Python 图形 GUI 库 pyqtgraph pyqtgraph 是纯 Python 图形 GUI 库,基于PyQT4 /pyside和NumPy.它主要目的用于在数学/科学/工程中.M ...
- 8个免费实用的C++GUI库
8个免费实用的C++GUI库 C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都 ...
- C/C++编程GUI库比较
转自:http://blog.csdn.net/lostown/article/details/658654 最强的GUI库当属Qt,毕竟是商业化的东西,功能最完整,什么都好,包括类似java代码风格 ...
随机推荐
- 【微软】微软程序注册(zfile自建API)
Zfile支持设置自己的回调地址,怎么设置呢? 参考:https://docs.zfile.vip/advanced/onedrive-api/ 上面文档写的很清楚了,我提醒两点 1.进入 https ...
- 性能测试 -- docker部署grafana
一.前提 1.安装好了docker 2.docker内 和 jmeter脚本 全都已经部署好了influxdb,并且数据采集等都正常 二.docker 部署 grafana 的操作步骤 1.下载 do ...
- java - Powermock-Failed to transform class with name...ArrayIndexOutOfBoundsException: 3
I'm trying to run a junit test. i'm using: junit 4.10,easymock 3.0,powermock-core 1.4.10 (uses javas ...
- Qt开源作品42-视频监控布局
一.前言 自从做监控系统以来,就一直有打算将这个功能独立出来一个类,这样的话很多系统用到此类布局切换,通用这个类就行,而且后期此布局会增加其他异形布局,甚至按照16:9之类的比例生成布局,之前此功能直 ...
- Qt编写的项目作品24-人脸识别综合应用(在线+离线+嵌入式)
一.功能特点 支持的功能包括人脸识别.人脸比对.人脸搜索.活体检测等. 在线版还支持身份证.驾驶证.行驶证.银行卡等识别. 在线版的协议支持百度.旷视,离线版的支持百度,可定制. 除了支持X86架构, ...
- [转]OpenCV4.8 GPU版本CMake编译详细步骤 与CUDA代码演示
导 读 本文将详细介绍如何使用CMake编译OpenCV4.8 CUDA版本并给出Demo演示,方便大家学习使用. CMake编译详细步骤 废话不多说,直接进入正题! [1]我使用的工具版本VS201 ...
- win7语言栏不见了,只显示搜狗输入法,不显示中文(简体)-美式键盘
参考百度经验: win7右下角输入法图标不见了[终极方法]
- 给 Python 添加进度条 | 给小白的 tqdm 精炼实例!
给 Python 添加进度条 | 给小白的 tqdm 精炼实例! 假设我们有一个循环: for i in range(100): do_something() # 这里做某些事 假设 do_somet ...
- 【狂神说Java】Java零基础学习笔记-面向对象
[狂神说Java]Java零基础学习笔记-面向对象 面向对象01:什么是面向对象 面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么.... 面对过程适合处理一些较为简 ...
- Windows安全加固(一)
目录: 1.在win ser2016中如何管理重命名administrator,禁用GUEST 2.禁用GUEST账户 3.系统不显示上次登录的账户名. 4.清理系统无效账户. 5.按用户类型分配账号 ...