<Rust>egui学习之小部件(六):如何在窗口中添加菜单栏部件?

前言
本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。

环境配置
系统:windows
平台:visual studio code
语言:rust
库:egui、eframe

概述
本文是本专栏的第六篇博文,主要讲述如何在窗口中添加菜单部件的使用。

事实上,类似于iced,egui都提供了示例程序,本专栏的博文都是建立在官方示例程序以及源代码的基础上,进行的实例讲解。
即,本专栏的文章并非只是简单的翻译egui的官方示例与文档,而是针对于官方代码进行的实际使用,会在官方的代码上进行修改,包括解决一些问题。

系列博客链接:
1、<Rust>egui学习之小部件(一):如何在窗口及部件显示中文字符?
2、<Rust>egui学习之小部件(二):如何在egui窗口中添加按钮button以及标签label部件?
3、<Rust>egui学习之小部件(三):如何为窗口UI元件设置布局(间隔、水平、垂直排列)?
4、<Rust>egui学习之小部件(四):如何在窗口中添加滑动条部件?
5、<Rust>egui学习之小部件(五):如何在窗口中添加图像部件?

部件属性

在egui中添加菜单,使用menu_button来实现。
官方定义:

 pub fn menu_button<R>(       &mut self,title: impl Into<WidgetText>,add_contents: impl FnOnce(&mut Ui) -> R,) -> InnerResponse<Option<R>> {if let Some(menu_state) = self.menu_state.clone() {menu::submenu_button(self, menu_state, title, add_contents)} else {menu::menu_button(self, title, add_contents)}}

官方给了使用的例子:

 egui::__run_test_ui(|ui| {                                         ui.menu_button("My menu", |ui| { ui.menu_button("My sub-menu", |ui| { if ui.button("Close the menu").clicked() { ui.close_menu(); }});});});

我们先来看一下简单的样式:

   ui.menu_button("文件", |ui|{ if ui.button("打开").clicked(){ }if ui.button("关闭").clicked(){ }});

在这里插入图片描述
再看一下嵌套子菜单的样式:

 ui.menu_button("文件", |ui|{if ui.button("打开").clicked(){}if ui.button("关闭").clicked(){}ui.menu_button("其他", |ui|{if ui.button("导入").clicked(){}if ui.button("导出").clicked(){}})});

在这里插入图片描述
没什么问题,我们尝试设置一下按钮的样式:

ui.menu_button(RichText::new("文件") .background_color(Color32::from_rgb(0, 255, 244)), |ui|{ui.set_width(100.0);ui.set_max_height(200.0);ui.add_space(10.0);if ui.button(RichText::new("打开").background_color(Color32::from_rgb(0, 255, 200))).clicked(){}if ui.button("关闭").clicked(){}ui.menu_button("其他", |ui|{if ui.button("导入").clicked(){}if ui.button("导出").clicked(){}})});

在这里插入图片描述
以上就是菜单部件的一些应用,可以看到,虽然简单,但是以上只是一组菜单按钮的编写,如果菜单栏比较多,那么程序会比较长,所以,我们希望能将这些菜单的布局写在一个单独的mod里。

菜单布局封装

事实上很简单,就是新建一个单独的文件,将菜单的布局都写在此文件里,然后在main程序里调用此mod即可。

我们新建一个文件menu_ui.rs,在里面新建一个函数:

pub fn menucreate(ui:&mut Ui,ma:&mut MyApp)-> InnerResponse<Option<()>>{  //文件菜单ui.menu_button("文件", |ui|{if ui.button("新建").clicked(){};if ui.button("打开").clicked(){if let Some(path) = FileDialog::new().pick_file() {ma.pickedpath = path.display().to_string();}ui.close_menu()};if ui.button("保存").clicked(){};if ui.button("退出").clicked(){ui.close_menu();ui.ctx().send_viewport_cmd(egui::ViewportCommand::Close); }}); //选项菜单ui.menu_button("选项", |ui|{if ui.button("选项1").clicked(){}});//设置菜单ui.menu_button("设置", |ui|{if ui.button("设置").clicked(){}let imgfile=egui::include_image!("../icons/btn_img1.png");if ui.add(Button::image_and_text(egui::Image::new(imgfile), "保存")).clicked(){}});//工具菜单ui.menu_button("工具", |ui|{if ui.button("工具").clicked(){}});//帮助菜单ui.menu_button("帮助", |ui|{if ui.button("关于").clicked(){ui.close_menu();MessageDialog::new().set_title("提示").set_description("这是基于egui的测试软件,编程语言是rust").set_buttons(rfd::MessageButtons::Ok).set_level(rfd::MessageLevel::Info).show();}if ui.button("此软件").clicked(){ui.close_menu();                      }})}

然后我们在main程序里导入:

mod menu_ui;

调用函数:

  ui.horizontal(|ui|{menu_ui::menucreate(ui,self);      });

此处使用水平布局,因为默认是垂直布局。
看一下效果:
在这里插入图片描述
可以看到,菜单栏是正常显示的,这样一来,我们就可以在单独的mod里编写菜单项,而不会是main程序变得非常冗长了。
由于egui的按钮也支持图片,所以我们为菜单的按钮添加图片看看:

//设置菜单ui.menu_button("设置", |ui|{if ui.button("设置").clicked(){}let imgfile=egui::include_image!("../icons/btn_img1.png");if ui.add(Button::image_and_text(egui::Image::new(imgfile), "保存")).clicked(){}});

在这里插入图片描述
以上是关于egui中添加菜单栏的简单实现,后面会有专门的势力来集合部件的应用,请专注后续的实例专栏。

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

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

相关文章

【爬虫软件】采集抖音博主的主页发布作品

这是我用python开发的抖音爬虫采集软件&#xff0c;可自动按博主抓取已发布视频。 软件界面截图&#xff1a; 爬取结果截图&#xff1a; 几点重要说明&#xff1a; 软件使用演示视频&#xff1a; https://www.bilibili.com/video/BV1Kb42187qf 完整讲解文章&#xff1a; ht…

释放金融交易的未来:掌握量化机器人技术

在金融交易的竞技场上&#xff0c;量化机器人技术正成为投资者手中的一张王牌&#xff0c;引领着交易策略的未来。本文将向您展示量化机器人如何成为金融交易的变革者&#xff0c;并向您展示如何利用这一技术来优化您的投资策略。 量化机器人的力量 量化机器人技术是金融交易领…

Anaconda3简介与安装步骤

目录 Anaconda3简介与功能 1.Anaconda3简介 2.主要功能和特点 3.使用场景 4.总结 Anaconda3安装 1.Anaconda3下载 1.1我的百度网盘 1.2官网下载 1.2.1访问官网 1.2.2输入邮箱 1.2.3登录你的邮箱下载&#xff08;你的噶&#xff09; 2.安装 2.1双击安装 2.2选择安…

Linux——nginx 负载均衡

常规的web服务器一般提供对于静态资源的访问&#xff0c;比如说&#xff1a;图片、web样式 网站提供的大部分交互功能都需要web编程语言的支持&#xff0c;而web服务对于程序的调用&#xff0c;不管编译型语言还是解释型语言&#xff0c;web服务同将对于应用程序的调用递交给通…

路别走窄了,华为认证的这些方向,比数通值钱

华为认证作为全球领先的ICT技术认证之一&#xff0c;以其高标准和权威性在全球范围内受到认可。它不仅代表了专业技能的国际水平&#xff0c;更是IT专业人士职业生涯中的重要里程碑。但谈论起华为认证&#xff0c;似乎大家都默认首选数通。 不止在华为认证&#xff0c;而是在整…

Vue使用v-model收集各种表单数据、过滤器

目录 1. 使用v-model收集各种表单数据2. 日期格式化3. 过滤器 1. 使用v-model收集各种表单数据 若<input type“text”/>&#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值若<input type“radio”/>&#xff0c;则v-model收集的是value值&a…

H5开发有哪些技巧?

随着现代社会的飞速发展&#xff0c;网页开发已经从传统的HTML、CSS、JavaScript往H5发展。H5也称为HTML5&#xff0c;可以理解为是HTML的升级版&#xff0c;具有更加优秀的性能、更加完善的功能和更加多样的体验。因其灵活性和跨平台特性&#xff0c;成为了各类移动应用和网页…

R语言报错 | object ‘integral‘ not found whilst loading name

1、报错背景 Registered S3 method overwritten by htmlwidgets:method from print.htmlwidget tools:rstudio Error: package or namespace load failed for ‘Seurat’:object integral not found whilst loading namespace spatstat.core 当我想library&…

sheng的学习笔记-AI-半监督学习

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是半监督学习 我们在丰收季节来到瓜田&#xff0c;满地都是西瓜&#xff0c;瓜农抱来三四个瓜说这都是好瓜&#xff0c;然后再指着地里的五六个瓜说这些还不好&#xff0c;还需再生长若干天。基于这些信息&a…

【Qt CMake】Qt5Widgets.dll:-1: error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取

项目场景&#xff1a; CMake 编译QT 工程 编译报错 E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll&#x1f44e; error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取 问题描述 Cmkae 报错&#xff1a; E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll…

Linux 数据结构 链表

1.段错误调试方法&#xff1a; 1.按照网上的方法配置Ubuntu&#xff0c;允许生成core文件 2.重新编译代码并加入-g选项(允许进行GDB调试) 3.ulimit -c unlimited 不限制core文件的生成的大小 4.执行代码,复现段错误,产生包含出错信息的core文件(检查cor…

Android UI绘制原理:UI的绘制流程是怎么样呢?为什么子线程不能刷新UI呢?讲解大体的流程是怎么样的

目录&#xff1a; 一、 为什么要学习android UI绘制原理呢&#xff1f;对我们有什么帮助&#xff1f; 1.解决复杂布局问题&#xff1a;了解UI绘制原理可以帮助我们更好地理解和解决布局问题&#xff0c;比如使用自定义View、优化布局层级等。 2.知道何时触发布局&#xff08;…

redis面试(二十五)CountDownLatch实现

CountDownLatch最基本的原理&#xff0c;就是用来阻塞线程的&#xff0c;java本身也有CountDownLatch&#xff0c;用多线程处理分批处理多数据的时候很有用 基本的逻辑就是&#xff0c;同时开多个子线程&#xff0c;然后主线程进入等待&#xff0c;只有当其他子线程全都结束之…

JAVA后端框架【spring】--超详解

什么是spring? spring是一个轻量级的ioc和Aop的一站式java开发框架&#xff0c;简化企业级开发 轻量级&#xff1a;框架体积小&#xff08;核心模块&#xff09; IOC IOC:inversion of control 控制反转 把创建对象的控制权反转给spring框架 AOP Aop:面向切面编程 将程…

pnpm 查看库的所有版本

1、最近在做图布局的时候&#xff0c;发现默认版本是beta版 2、那么我们如何来查看远程库中有什么版本可以安装呢&#xff1f; 3、使用命令&#xff1a; pnpm view antv/layout versions pnpm view 这里替换成要查看的库名 versions

Android APP 常见概念与 adb 命令

adb 的概念 adb 即 Android Debug Bridge 。在窗口输入 adb 即可显示帮助文档。adb 实际上就是在后台开启一个 server&#xff0c;会接收 adb 的命令然后帮助管理&#xff0c;控制&#xff0c;查看设备的状态、信息等&#xff0c;是开发、测试 Android 相关程序的最常用手段。…

Jenkins安装使用详解,jenkins实现企业级CICD流程

文章目录 一、资料1、官方文档 二、环境准备1、安装jdk172、安装maven3、安装git4、安装gitlab5、准备我们的springboot项目6、安装jenkins7、安装docker8、安装k8s&#xff08;可选&#xff0c;部署节点&#xff09;9、安装Harbor10、准备带有jdk环境的基础镜像 三、jenkins实…

addroutes和next()导致的页面无法跳转问题,如登录之后无法跳转到首页,无法重定向,使用next(to)

版本 vue router 3 问题说明 登录成功后&#xff0c;想重定向到/index&#xff0c;执行router.push之后进入beforeEach&#xff1b; 由于第一次访问&#xff0c;判断用户信息为空&#xff0c;需要异步拉取用户的权限等信息&#xff0c; 获得响应后&#xff0c;使用addRoutes批…

harbor部署+docker-compose

harbor部署 harbor介绍 Harbor 是一个开源的企业级容器镜像仓库&#xff0c;用于存储和分发 Docker 镜像及其他容器格式的镜像。 Harbor 提供了一个集中化的存储库&#xff0c;方便团队成员共享和管理容器镜像。你可以将构建好的镜像推送到 Harbor 仓库中&#xff0c;其他成…

用python启动nacos和redis

import subprocess import tkinter as tk from tkinter import ttk, messagebox from subprocess import Popen, run, PIPE# 启动Nacos的函数 def start_nacos():startup_cmd_path rD:\environment\code-software\nacos-server-1.4.1\nacos\bin\startup.cmd# 异步启动NacosPop…