当前位置: 首页 > news >正文

实用指南:Rust Slint实现列表式消息提示(Notification Dialog)源码分享

实用指南:Rust Slint实现列表式消息提示(Notification Dialog)源码分享

Rust Slint实现列表式消息提示(Notification Dialog)源码分享

  • 一、效果展示
  • 二、源码分享
    • 1、工程搭建
    • 2、main.rs
    • 3、main.slint
    • 4、models.slint
    • 4、图片资源文件
    • 5、工程结构
  • 三、Slint库介绍
    • 1、Slint的核心特性
    • 2、在Rust中使用Slint
    • 3、简单示例:创建一个窗口
    • 4、适用场景和优势
    • 5、学习资源

一、效果展示

在这里插入图片描述
在这里插入图片描述

二、源码分享

1、工程搭建

工程搭建参考我这篇文章:Rust Slint工程搭建详细教程

2、main.rs

use std::ptr::addr_eq;
use std::sync::{Arc, Mutex};
use slint::{PlatformError, ToSharedString, WindowPosition};
slint::include_modules!();
use slint::{Color,Brush};
use slint::Timer;
fn main() ->Result<(), PlatformError>{let app: MainWindow  = MainWindow::new()?;let weak: slint::Weak<MainWindow> = app.as_weak();let mut message: Arc<Mutex<Vec<NotificationValue>>> = Arc::new(Mutex::new(Vec::new()));let mut cnt = 0;app.global::<DataAdapter>().on_btn_clicked({let weak = weak.clone();let message = message.clone();move |text|{if let Some(strong) = weak.upgrade(){let adapter = strong.global::<DataAdapter>();cnt +=1;let msg = NotificationValue{message:format!("message {cnt}").to_shared_string(),timeout:3000,mtype:{if cnt == 1{NotificationType::Info}else if cnt == 2{NotificationType::Warning}else {cnt = 0;NotificationType::Error}},};message.lock().unwrap().insert(0,msg);adapter.set_notificationModel(slint::ModelRc::new(slint::VecModel::from(message.lock().unwrap().clone())));}}});let timer = Timer::default();timer.start(slint::TimerMode::Repeated, std::time::Duration::from_millis(100), {let weak = weak.clone();let message = message.clone();move || {if let Some(strong) = weak.upgrade(){let adapter = strong.global::<DataAdapter>();let mut to_remove = Vec::new();{let mut messages = message.lock().unwrap();for (index, item) in messages.iter_mut().enumerate() {if item.timeout <= 0 {to_remove.push(index);} else {item.timeout -= 100;}}}// 在锁外删除元素if !to_remove.is_empty() {let mut messages = message.lock().unwrap();for &index in to_remove.iter().rev() {messages.remove(index);}adapter.set_notificationModel(slint::ModelRc::new(slint::VecModel::from(messages.clone())));}}}});let _ = app.run();Ok(())}

3、main.slint

import { AboutSlint, VerticalBox, LineEdit, HorizontalBox, Button, GroupBox, GridBox,
ComboBox, Spinner, Slider, ListView, Palette, ProgressIndicator, CheckBox, Switch } from "std-widgets.slint";
import { DataAdapter,NotificationType,NotificationValue } from "models.slint";
export { DataAdapter}
component NotificationView inherits VerticalLayout{
width: 300px;
height: 300px;
private property <image> icon_info:@image-url("./image/icon_info.svg");private property <image> icon_warning:@image-url("./image/icon_warning.svg");private property <image> icon_error:@image-url("./image/icon_error.svg");ListView {for item[idx] in DataAdapter.notificationModel :Rectangle{width: 100%;height: 50px;border-radius: 15px;border-width: 1px;Rectangle {width: 100%;height: 90%;border-radius: 15px;border-width: 1px;background: item.mtype == NotificationType.Info ? #5abc0561 :item.mtype == NotificationType.Warning? #cad61861: #f1262661;HorizontalLayout {padding: 6px;Image {width: self.height;height: parent.height - parent.padding*2;source: item.mtype == NotificationType.Info ? icon_info :item.mtype == NotificationType.Warning? icon_warning: icon_error;}Text {text: item.message;font-size: 15px;color: white;horizontal-alignment: center;vertical-alignment: center;wrap: TextWrap.word-wrap;}}}}}}export component MainWindow inherits Window {width: 800px;height: 600px;title: "window1";background: #6d0bee;NotificationView{y:0;}Button {width: 150px;height: 50px;text: "add message";clicked => {DataAdapter.btn_clicked("ddd");}}}

4、models.slint

export enum  NotificationType {
Info,
Warning,
Error
}
export struct NotificationValue {
mtype:NotificationType,
message:string,
timeout:int,
}
export global DataAdapter {
in-out property <[NotificationValue]> notificationModel;callback btn_clicked(string);}

4、图片资源文件

文章顶部下载

5、工程结构

在这里插入图片描述

三、Slint库介绍

Slint(原名SixtyFPS)是一个轻量级、高性能的用户界面(UI)工具包,专为嵌入式系统、桌面应用和跨平台开发设计。它采用声明式UI编程模型,支持Rust、C++和JavaScript等语言,强调资源高效、低延迟和易用性。Slint的核心目标是简化UI开发,尤其适合资源受限环境(如微控制器)或需要高性能渲染的场景。

1、Slint的核心特性

2、在Rust中使用Slint

在Rust项目中集成Slint简单高效:

  • 安装依赖:通过Cargo添加slint crate。在Cargo.toml中添加:
    [dependencies]
    slint = "1.13.1"  # 使用最新稳定版本
  • 基本工作流
    1. 定义UI:使用slint!宏编写声明式UI代码。
    2. 编译UI:Slint编译器(slintc)将.slint文件编译为Rust代码。
    3. 集成逻辑:在Rust中绑定数据和事件处理。
  • 优势:Rust的内存安全和并发特性与Slint结合,提升UI可靠性和性能,避免常见错误如空指针或数据竞争。

3、简单示例:创建一个窗口

以下是一个基础的“Hello World”示例,展示如何在Rust中定义并运行一个Slint UI。代码结构清晰:

use slint::slint;
slint! {
// 定义UI组件
export component MainWindow inherits Window {
// 添加文本元素
Text {
text: "Hello, Slint!";
color: blue;
font-size: 24px;
}
}
}
fn main() {
// 创建并运行窗口
let window = MainWindow::new().unwrap();
window.run().unwrap();
}
  • 解释
    • slint!宏内嵌UI定义,使用类似HTML的语法。
    • export component定义可重用的UI组件,继承自Window
    • Text元素显示文本,属性如colorfont-size可动态绑定。
    • main函数初始化并运行UI,错误处理简单(unwrap用于演示,实际应更健壮)。

4、适用场景和优势

  • 嵌入式系统:低内存占用(可优化至几百KB),适合IoT设备或车载系统。
  • 桌面应用:跨平台一致性,无需Web技术栈,性能优于Electron等框架。
  • 开发效率:声明式语法减少样板代码,调试工具(如Slint Viewer)加速迭代。
  • 与其他库对比:相比GTK或Qt,Slint更轻量;相比Web框架,它提供原生性能和更少依赖。
  • 社区支持:开源项目(Apache 2.0许可证),活跃社区提供文档和示例。

5、学习资源

在这里插入图片描述

http://www.jsqmd.com/news/38484/

相关文章:

  • 软件工程团队作业2
  • 逆向基础--数据传输指令xlat push pop lea-lds-les (11)
  • RED 状态
  • EMS4100N芯祥科技USB3.1高速双向模拟开关芯片资料,可pin对pin替代ASW3410
  • Chromium扩展策略绕过漏洞CVE-2025-12436安全分析
  • 让AI替你写用例!Dify+RAG工作流,一键生成覆盖率达90%的测试方案
  • 2025年脱硫除臭菌实力厂家权威推荐榜单:微生物除臭剂/硝化细菌/氨氮去除菌源头厂家精选
  • 图库函数集
  • 国产水质检测仪厂家推荐:采购COD检测仪/总氮/总磷/余氯检测仪的注意事项
  • V4L2的pad连接
  • 2025年11月全自动红外测油仪采购推荐:国产全自动红外测油仪品牌推荐,哪家好?
  • aws的iam
  • 10分钟搞懂!化学人刚需的6大核心期刊
  • 2025-2026年水质测定仪品牌推荐:总磷/总氮/氨氮/COD测定仪哪个品牌好?
  • 副本分片重建
  • 2025年空化液体电辅供热机组定制厂家权威推荐榜单:电锅炉/工业电锅炉/水分子物化供热机组源头厂家精选
  • 详细介绍:STM32 GPIO-------设置成51单片机模式输出
  • 2025高压加速老化/HAST/PCT/热流仪厂家推荐伟煌试验设备,专业可靠!
  • PK6500无源探头在5G基站射频模块测试中的应用方案
  • 2025开窗器/链条/机芯/配件厂家推荐湖州万荣,专业制造品质保障
  • 画图
  • 2025膜结构车棚/景观/体育看台/污水池加盖厂家推荐潍坊乾多,专业建造,品质保障
  • 2025 年 11 月配电柜/配电箱/开关柜厂家推荐排行榜,智能配电系统,低压配电柜,高压开关柜,户外配电箱公司推荐
  • 2025年11月学习平板推荐!学而思凭 AI功能成家长首选
  • 2025年电镜实验室安装订做厂家权威推荐榜单:电镜实验室设计/电镜安装/电镜实验室建设源头厂家精选
  • 激光二极管增透膜技术:提升光学性能的关键方案
  • 【传奇开心果系列】基于Flet框架实现的桌面代码登录验证和SQLite 数据库结合实现数据持久化和多页面导航自定义组件模板特色和达成原理深度解析
  • 自适应动态规划(Adaptive Dynamic Programming,ADP)算法,采用演员-评论家(评价-执行)网络,看这一文即可【非常详细推导,认真推理,包你看得懂】 - 实践
  • 2025 EVA/EVA发泡胶/板材/卷材/片材厂家推荐深圳市共创辉煌,防火/阻燃/防静电多性能保障
  • 故障发现提速 80%,运维成本降 40%:魔方文娱的可观测升级之路