[Rust GUI]eframe(egui框架)代码示例

news2025/1/21 12:53:12

-2、eframe代替品

你可以使用egui的其他绑定,例如:egui-miniquad,bevy_egui,egui_sdl2_gl 等。

-1、注意

egui库相当于核心库,需要借助eframe框架就可以写界面了。
eframe使用egui_glow渲染,而egui_glow需要opengl2.0+。

0、准备

1、安装Visual Studio C++ Build tools

1、访问微软官网下载生成工具
2、勾选这个
https://blog.csdn.net/qq_39124701/article/details/132836150
3、对比勾选细节
https://blog.csdn.net/qq_39124701/article/details/132836150
4、点击安装
5、安装完成
https://blog.csdn.net/qq_39124701/article/details/132836150
6、关闭Visual Studio Installer
7、重启电脑

2、安装Rust

访问Rust官网下载 RUSTUP-INIT.EXE(64位)
在 PowerShell 中运行$ENV:RUSTUP_DIST_SERVER='https://mirrors.ustc.edu.cn/rust-static';$ENV:RUSTUP_UPDATE_ROOT='https://mirrors.ustc.edu.cn/rust-static/rustup';.\rustup-init.exe,输入1并回车
https://blog.csdn.net/qq_39124701/article/details/132836150

3、设置cargo镜像

运行powershell -command ii (where.exe cargo).substring(0,(where.exe cargo).Length-'\bin\cargo.exe'.Length)
.cargo目录下新建文件,名为config,无后缀名,保存为以下内容

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

4、安装VSCode

访问这个👉链接:如何下载安装VSCode
安装插件:简体中文、rust-analyzer(中英双语版)

5、下载字体文件

访问kose-font仓库下载小赖字体,使用其中的XiaolaiMonoSC-Regular.ttf文件,提取出来备用

0、编程

1、使用cargo创建项目

运行cargo new eframe-hello;cd eframe-hello

2、添加板条箱eframe

运行cargo add eframe(此时版本为v0.22.0)

3、使用VSCode打开项目

运行code .
选中.\eframe-hello\src\main.rs文件,将激活插件,等待插件加载完毕。

4、运行

运行cargo run,等待编译完成,正常输出Hello, world!
https://blog.csdn.net/qq_39124701/article/details/132836150

5、添加字体文件

打开.\eframe-hello\src路径
XiaolaiMonoSC-Regular.ttf放入该路径

6、编辑.\eframe-hello\src\main.rs

6.1 添加属性指令

// 在Windows平台运行时不会弹出控制台框
#![windows_subsystem = "windows"]

6.2 导入

use eframe::egui;
use eframe::epaint::Color32;
use egui::FontFamily::Proportional;
use egui::FontId;
use egui::TextStyle::*;

6.3 加载字体


// 参考:https://github.com/xuxiaowei-com-cn/cargo_egui/blob/main/src/main.rs
fn load_fonts(ctx: &egui::Context) {
    // 参考(废弃):https://github.com/emilk/egui/blob/0.17.0/eframe/examples/custom_font.rs
    // 参考(推荐):https://github.com/emilk/egui/blob/0.18.1/examples/custom_font/src/main.rs

    // 从默认字体开始(我们将添加而不是替换它们)。
    let mut fonts = egui::FontDefinitions::default();

    // 安装我自己的字体(也许支持非拉丁字符)。
    // 支持 .ttf 和 .otf 文件。
    // XiaolaiMonoSC-Regular.ttf 来自 https://gitee.com/lxgw2020/kose-font
    fonts.font_data.insert(
        "my_font".to_owned(),
        egui::FontData::from_static(include_bytes!("XiaolaiMonoSC-Regular.ttf")),
    );

    // 将我的字体放在首位(最高优先级)用于比例文本:
    fonts
        .families
        .entry(egui::FontFamily::Proportional)
        .or_default()
        .insert(0, "my_font".to_owned());

    // 将我的字体作为等宽字体的最后后备:
    fonts
        .families
        .entry(egui::FontFamily::Monospace)
        .or_default()
        .push("my_font".to_owned());

    // 告诉 egui 使用这些字体
    // 新字体将在下一帧开始时激活。
    // https://docs.rs/egui/latest/egui/struct.Context.html#method.set_fonts
    ctx.set_fonts(fonts);
}

6.4 实例

// 人
struct People {
    name: String,
    age: u32,
}

6.5 默认值

// 默认值
impl Default for People {
    fn default() -> Self {
        // 创建一个 People 结构体的默认实例
        Self {
            name: "刘北辰".to_owned(),
            age: 20,
        }
    }
}

6.6 实现

impl People {
    // 创建一个新的 People 实例
    fn new(cc: &eframe::CreationContext<'_>) -> Self {
        load_fonts(&cc.egui_ctx); // 加载字体
        Self::default() // 使用默认值创建 People 实例
    }
}

6.7 Trait

impl eframe::App for People {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        let mut style = (*ctx.style()).clone();
        // 重新定义文本样式
        style.text_styles = [
            (Heading, FontId::new(60.0, Proportional)), // 标题字体
            (Name("Heading2".into()), FontId::new(50.0, Proportional)), // 标题2字体
            (Name("Context".into()), FontId::new(50.0, Proportional)), // 上下文字体
            (Body, FontId::new(36.0, Proportional)),    // 正文字体
            (Monospace, FontId::new(28.0, Proportional)), // 等宽字体
            (Button, FontId::new(28.0, Proportional)),  // 按钮字体
            (Small, FontId::new(20.0, Proportional)),   // 小号字体
        ]
        .into();
        // 使用上述更改,修改全局样式
        ctx.set_style(style);

        let frame = egui::containers::Frame {
            // 外边距
            outer_margin: egui::vec2(5.0, 5.0).into(),
            // 圆角
            rounding: egui::Rounding::same(4.0),
            // 填充颜色
            fill: Color32::DARK_GRAY,
            ..Default::default()
        };
        egui::CentralPanel::default().frame(frame).show(ctx, |ui| {
            // 默认文字颜色
            ui.visuals_mut().override_text_color = Some(egui::Color32::from_rgb(255, 128, 0));
            // 默认滑块宽度
            ui.style_mut().spacing.slider_width = 285.0;
            // 显示大文本
            ui.heading("修改年龄");
            // 使用水平布局启动 ui
            ui.horizontal(|ui| {
                // 显示姓名标签文本
                let name_label = ui.label("姓名: ");
                // 单行文本编辑框,由姓名标签标识
                ui.text_edit_singleline(&mut self.name)
                    .labelled_by(name_label.id);
            });
            // 滑块
            ui.add(egui::Slider::new(&mut self.age, 20..=79).text("岁"));
            // 按钮
            if ui.button("点击增加年龄").clicked() {
                if self.age < 79 {
                    self.age += 1;
                }
            }
            // 显示文本
            ui.label("修改结果:");
            // 显示姓名和年龄
            ui.label(format!("姓名:{}, 年龄:{}", self.name, self.age));
            // 显示作者信息 https://blog.csdn.net/qq_39124701/article/details/132836150
            ui.label("作者: CSDN - 三巧");
        });
    }
}

6.8 main

fn main() {
    // 设置原生应用程序选项
    let options = eframe::NativeOptions {
        initial_window_size: Some(egui::vec2(414.0, 314.0)), // 设置初始窗口大小
        ..Default::default()
    };
    let _ = eframe::run_native(
        "egui修改年龄 - CSDN三巧", // 设置应用程序窗口标题
        options,
        Box::new(|cc| Box::new(People::new(cc))), // 创建并返回实现 eframe::App 特征的 People 对象
    );
}

7、运行

运行cargo run,等待编译完成,显示窗口
在这里插入图片描述
输入框输入姓名,姓名同步修改
滑动滑块,年龄变动
点击滑块右侧输入具体数值,年龄同步修改
点击增加年龄按钮,年龄增加1岁,数值最高79

8、构建

运行命令:cargo build
生成位置:.\eframe-hello\target\debug\eframe-hello.exe

9、其他

egui在Github的仓库
egui-doc-cn
https://docs.rs/eframe/latest/eframe/
https://crates.io/crates/eframe



https://blog.csdn.net/qq_39124701/article/details/132836150

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

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

相关文章

华为云云耀云服务器L实例评测 | 强大性能与高可靠性的完美结合

华为云云耀云服务器L实例评测 | 瑞吉外卖下载与部署_软工菜鸡的博客-CSDN博客 上次发布了一篇手把手带领读者在华为云服务器搭建后端程序员无人不知的 瑞吉外卖 项目&#xff0c;效果良好&#xff0c;很多粉丝给我反馈还想学习别的项目以及其它软件的服务器部署&#xff0c;这不…

Mobpush与A/B测试:覆盖多应用场景下的精细化运营神器

在信息爆炸的移动应用领域&#xff0c;实现长效稳定的用户增长的关键在于能够和用户建立互信、持久的联系。而优质的推送内容不仅可以提高用户参与度和留存率&#xff0c;还有助于增加收入、改善用户体验&#xff0c;以及建立强大的用户社区。但千人一面的推送很难同时满足不同…

网络安全宣传周|探索AI数字人的魅力和价值所在

9月11日至9月17日是国家网络安全宣传周&#xff0c;在福州举办的安全博览会上有着多种人工智能模型产品亮相现场&#xff0c;吸引着众多参观者的目光&#xff0c;尤其是AI数字人面对不同的问题、不同的场景都可以进行实时响应&#xff0c;不同于冷冰冰的传统智能客服的对话场景…

c++day6---9.13

思维导图&#xff1a; 改变类型只需将选择功能函数中的Zhan<double> z;中的double改为相对的类型: 栈&#xff1a; 头文件&#xff1a; #ifndef ZHAN_H #define ZHAN_H #include <iostream>using namespace std;template<typename T> class Zhan { privat…

RK3399 android7.1 实现双wifi功能 STA+AP

wifi模组&#xff1a; 主板使用的wifi模块为海华AW-NM43438W模组以及客户提供了一款USB接口的5G双频无线网卡RTL8821CU。 双wifi功能实现效果&#xff1a; 主板自带的wifi模组作为station正常连接外部wifi,USB接口的外接网卡作为AP&#xff08;热点&#xff09;供其他设备连接…

JavaScript逻辑题:牙膏2元 牙刷5元 牙膏盒15元 请问正好花完100元 有多少情况?

// 定义牙膏 牙刷 牙膏盒分别的价格 let toothpaste 0;let toothbrush 0;let toothpastebox 0;// 定义sum用来存储几种情况let sum 0;//第一层循环 循环牙膏买多少for (let i 0; i < 20; i){toothpaste 5 * i;// 二层循环 循环牙刷的数量for (let j 0; j < 50; j…

【Java Web】HTML 标签 总结

目录 1.HTML 2.标签 1. head 标签 1.图标 2.样式居中 2. body 标签 1.注释 &#xff1a; 2.加载图片 3.加载视频 效果 4.区域 效果 5.上下跳转&#xff0c;页面跳转 效果 6.表格 效果 7.有序列表&#xff0c;无序列表 效果 8.登录 效果 9.按钮 10.多选框…

目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)

目标分类 一、目标分类介绍1.1 二分类和多分类的区别1.2 单标签和多标签输出的区别 二、代码获取三、数据集准备四、环境搭建4.1 环境测试 五、模型训练六、模型测试6.1 多标签训练-单标签输出结果6.2 多标签训练-多标签输出结果 一、目标分类介绍 目标分类是一种监督学习任务…

使用flask实现一个简单的代理服务

背景: 有一些客户的服务是我本地windows电脑开vpn之后才能访问的。为了让公司内网的别的电脑不开vpn也能正常请求客户的接口&#xff0c;方便调试&#xff0c;所以使用我的windows电脑实现一个代理的功能。 原理简单画个图: 功能简单直接上代码: from flask import Flask, re…

如何用HighTec进行库文件封装

1、新建一个Workspace&#xff0c;下面均以L9945为例。 2、新建一个工程&#xff0c;可用要封装的模块名来命名。 3、选择主芯片及工程类型。 4、修改编译配置为iROM。 5、删除生成的h文件夹&#xff0c;将原工程中src目录下的.c文件全部删除&#xff0c;将.h文件全部复制到该工…

解决“org.apache.catalina.startup.Catalina.stopServer 未配置关闭端口。通过OS信号关闭服务器。服务器未关闭“

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 问题描述 项目部署至Tomcat服务器报错&#xff1a;org.apache.catalina.startup.Catalina.stopServer 未配置关闭端口。通过OS信号关闭服务 器。服务器未关闭&#xff1b;图…

【计算机视觉 | 目标检测】干货:目标检测常见算法介绍合集(一)

对象检测模型是用于执行对象检测任务的体系结构。 您可以在下面找到不断更新的对象检测模型列表。 文章目录 一、 ScanSSD二、Faster R-CNN三、Mask R-CNN四、YOLOv3五、RetinaNet六、Detection Transformer七、YOLOv4八、FCOS九、YOLOv2十、Fast R-CNN十一、CenterNet十二、R-…

uni-app--》基于小程序开发的电商平台项目实战(二)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

Acwing 800. 数组元素的目标和

Acwing 800. 数组元素的目标和 题目描述代码展示 题目描述 代码展示 #include<iostream>using namespace std;const int N 1e5 10;int a[N], b[N];int main() {int n , m , x, i 0, j m - 1;cin >> n >> m >> x;for (int i 0; i < n; i ) sc…

java JUC并发编程 第七章 原子操作类增强

系列文章目录 第一章 java JUC并发编程 Future: link 第二章 java JUC并发编程 多线程锁: link 第三章 java JUC并发编程 中断机制: link 第四章 java JUC并发编程 java内存模型JMM: link 第五章 java JUC并发编程 volatile与JMM: link 第六章 java JUC并发编程 CAS: link 第七…

ABB IW93 HESG440356R1处理器模块

处理能力&#xff1a; IW93处理器模块具有强大的处理能力&#xff0c;能够高效执行控制逻辑和算法&#xff0c;确保工业过程的顺利运行。 通信接口&#xff1a; 该模块通常具有多种通信接口&#xff0c;用于与其他设备和系统进行数据交换和集成。这些接口可能包括以太网、串行…

9.13号作业

1> 将之前定义的栈类和队列类都实现成模板类 栈的模块类 #include <iostream> using namespace std;template <typename T> class Stack { private:T data[40]{0};T top-1; public:Stack (){cout<<"这是构造函数"<<endl;}int stack_e…

相亲App定制开发,助力您打造独特交友平台

作为专业的App开发团队&#xff0c;我们致力于为您打造一款独特而出色的相亲交友App。我们深刻理解相亲领域的需求&#xff0c;通过技术创新和用户体验优化&#xff0c;为您提供个性化的定制开发服务。 在相亲App的定制开发过程中&#xff0c;我们将全面考虑您的目标市场和用户…

Java项目---图片服务器

图片服务器--->服务器&#xff08;图床&#xff09; 核心功能&#xff1a;上传图片、展示图片等 比如&#xff1a;编写博客时我们会插入图片&#xff0c;本质上是往文章中放了一个链接&#xff08;URL&#xff09;&#xff0c;这个URL资源在另外一个服务器上。 核心知识点…

在ubuntu18.04上编译C++版本jsoncpp/opencv/onnxruntime且如何配置CMakelist把他们用起来~

这篇文章背景是笔者在ubuntu上编译C代码&#xff0c;依赖一些包&#xff0c;然后需要编译并配置到CMakelist做的笔记。主要也是一直不太懂CMakellist&#xff0c;做个笔记以防忘记&#xff0c;也给读者提供一站式的参考&#xff0c;可能您需要的不是这几个包&#xff0c;但大同…