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

-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-fontfonts.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_fontsctx.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("修改年龄");// 使用水平布局启动 uiui.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/132836150ui.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.hqwc.cn/news/110241.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go初识iris框架(七) - 实战资源导入和项目框架搭建

实战项目框架搭建 如下是项目框架搭建后的说明&#xff1a; config:&#xff1a;项目配置文件及读取配置文件的相关功能controller:控制器目目录,项目各个模块的控制器及业务逻辑处理的所在目录datasource:实现mysql连接和操作、封装操作mysql数据库的目录。model:数据实体目…

【LeetCode热题100】--283.移动零

283.移动零 使用双指针&#xff1a; class Solution {public void moveZeroes(int[] nums) {if(nums null){return ;}int j 0;for(int i 0;i<nums.length;i){//当前元素不为0时&#xff0c;就把其交换到左边&#xff0c;等于0的交换到右边if(nums[i] ! 0){int tmp nums…

ChatGPT追祖寻宗:GPT-2论文要点解读

论文地址&#xff1a;Language Models are Unsupervised Multitask Learners 上篇&#xff1a;GPT-1论文要点解读 在上篇&#xff1a;GPT-1论文要点解读中我们介绍了GPT1论文中的相关要点内容&#xff0c;其实自GPT模型诞生以来&#xff0c;其核心模型架构基本没有太大的改变&a…

静态工厂模式,抽象工厂模式,建造者模式

静态工厂模式 ublic class FruitFactory {public static Fruit getFruit(String name) {Fruit fnull;switch (name){case "APPLE":{fnew Apple();}case "BANANA":{fnew Banana();}default :{System.out.println("Unknown Fruit");}}return f;} …

【Linux】对进程概念的理解

一丶进程概念 进程定义 进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例&#xff0c;包括程序计数器、寄存器和程序变量的当前值。 进程特征 1.进程依赖于程序运行而存在&#xff0c;进程是动态的&#xff0c;程序是…

二,手机硬件参数介绍和校验算法

文章目录 前言一、IMEI二、IMSI三、MEID四、ANDROID_ID五、设备序列号六、MAC地址 && 蓝牙地址补充 前言 傻瓜式操作, 人人都能编译操作系统, 每个感兴趣的人都可以基于谷歌安卓aosp源码定制自己的系统 一、IMEI 由14位16禁制字符和第15位校验位标识组成&#xff0c;而…

第十九章、【Linux】开机流程、模块管理与Loader

19.1.1 开机流程一览 以个人计算机架设的 Linux 主机为例&#xff0c;当你按下电源按键后计算机硬件会主动的读取 BIOS 或 UEFI BIOS 来载入硬件信息及进行硬件系统的自我测试&#xff0c; 之后系统会主动的去读取第一个可开机的设备 &#xff08;由 BIOS 设置的&#xff09; …

时序预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测

时序预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现NGO-BiLSTM北方苍鹰算法优…

【算法|虚拟头节点|链表】移除链表元素

Leetcode203 移除链表元素 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xf…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…

为什么AirtestIDE的selenium Window突然无法检索控件了?

1. 前言 最近有很多朋友跟我们反馈&#xff0c;为什么1.2.15版本的IDE没办法做网页元素检索了&#xff0c;是不是我们不支持selenium了之类的。 测试后发现&#xff0c;目前版本确实存在这个问题&#xff0c;原因是Chrome113.0.5672.127(最新)版本过高&#xff0c;AirtestIDE…

Python中的缓存库

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 缓存是一种可以存储数据以便快速访问的存储器。 它是一种小型的、快速的存储器&#xff0c;用于保存经常访问的数据。 缓存是必不可少的&#xff0c;因为它可以帮助提高系统的性能&#xff0c;减少系统访问缓慢的主存储器的…