自学内容网 自学内容网

<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学习之小部件(四):如何在窗口中添加滚动条Scroll部件?
5、<Rust>egui学习之小部件(五):如何在窗口中添加图像部件?
6、<Rust>egui学习之小部件(六):如何在窗口中添加菜单栏部件?
7、<Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?
8、<Rust>egui学习之小部件(八):如何在窗口中添加滑动条slider部件?
9、<Rust>egui学习之小部件(九):如何在窗口中添加下拉列表combobox部件?
10、<Rust>egui学习之小部件(十):如何在窗口中添加复选框checkbox部件?
11、<Rust>egui学习之部件(十一):如何在窗口中添加单选框radiobutton部件?

部件属性

在egui中,我们使用menu_button来创建菜单项,但是通常我们可能还会有右键显示菜单的需求,那么我们可以用context_menu项来赋予某个部件右键菜单:

pub(crate) const CONTEXT_MENU_ID_STR: &str = "__egui::context_menu";  

/// Response to secondary clicks (right-clicks) by showing the given menu.
pub(crate) fn context_menu(
    response: &Response,
    add_contents: impl FnOnce(&mut Ui),
) -> Option<InnerResponse<()>> {
    let menu_id = Id::new(CONTEXT_MENU_ID_STR);
    let mut bar_state = BarState::load(&response.ctx, menu_id);

    MenuRoot::context_click_interaction(response, &mut bar_state);
    let inner_response = bar_state.show(response, add_contents);

    bar_state.store(&response.ctx, menu_id);
    inner_response
}

可以发现,context_menu是一个crate,我们可以将其赋予大部分部件上,我们来看下实际应用:

ui.label("右击").context_menu(|ui|{
                    ui.label("右击菜单");
                    ui.add(Button::new("右击菜单按钮"));
                })

在上面的例子中,我们为标签右击添加了右键菜单,菜单包括:
标签、按钮
在这里插入图片描述
可以看到,使用是非常简单的,我们可以为菜单按钮点击一个点击反馈:

 if ui.add(Button::new("右击菜单按钮")).clicked(){
                        ui.close_menu(); 
                    };

点击后关闭菜单显示。

演示

在这里插入图片描述


原文地址:https://blog.csdn.net/normer123456/article/details/142547174

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!