Rust图形界面编程:egui平直布局

文章目录

平直布局

在前面的示例中,已经用到了ui.horizontal用来布局,其特点是水平摆放控件。相应地,ui.vertical则是垂直摆放控件。根据控件的摆放顺序不同,这两个布局组件衍生出一系列布局函数

  • horizontal_top, 此即horizontal默认的布局方式
  • horizontal_centered
  • horizontal_wrapped
  • vertical_centered, 此为vertical的默认布局方式
  • vertical_centered_justified

下面演示一下这几种布局的区别

rust 复制代码
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use eframe::egui;

struct MyApp {
}

impl Default for MyApp {
    fn default() -> Self {
        Self { }
    }
}

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.horizontal_wrapped(|ui| {
                for i in 1..8{
                    if ui.button(format!("horizontal_wrapped{}", i)).clicked(){};
                }
            });
            ui.horizontal_top(|ui| {
                for i in 1..8{
                    if ui.button(format!("horizontal_top{}", i)).clicked(){};
                }
            });
            ui.vertical_centered(|ui| {
                if ui.button("vertical_centered1").clicked(){};
                if ui.button("vertical_centered2").clicked(){};
            });
            ui.vertical_centered_justified(|ui| {
                if ui.button("vertical_centered_justified1").clicked(){};
                if ui.button("vertical_centered_justified2").clicked(){};
            });
            ui.horizontal_centered(|ui| {
                for i in 1..8{
                    if ui.button(format!("horizontal_centered{}", i)).clicked(){};
                }
            });


        });
    }
}

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions {
        initial_window_size: Some(egui::vec2(640.0, 320.0)),
        ..Default::default()
    };
    eframe::run_native(
        "layout",
        options,
        Box::new(|_cc| Box::<MyApp>::default()),
    )
}

效果如下

即以_warpped为后缀的水平布局,其控件会自动换行;以_justified为后缀的垂直布局,其控件会自适应水平方向的宽度;以centered为后缀的水平布局,会自动占据剩余空间的中间位置。

with_layout

这些水平或者垂直的布局显然不足以涵盖所有情况,所以egui提供了更加灵活的布局方法with_layout,其输入参数除了填充组件外,还有一个Layout类型的结构体,可调用下列函数来生成

  • left_to_right
  • right_to_left
  • top_down
  • top_down_justified
  • bottom_up
  • with_main_aligned
  • with_main_align
  • with_cross_align

这些函数的参数是枚举类型的Align,共有三个选择,分别是Min, Center以及Max。接下来,将show函数更改为如下形式,

rust 复制代码
egui::CentralPanel::default().show(ctx, |ui| {
    ui.with_layout(egui::Layout::left_to_right(egui::Align::Min),
     |ui| {
        for i in 1..5{
            if ui.button(format!("left_to_right{}", i)).clicked(){};
        }
    });
    ui.with_layout(egui::Layout::top_down(egui::Align::Max),
     |ui| {
        for i in 1..5{
            if ui.button(format!("top_down{}", i)).clicked(){};
        }
    });
});

得到结果如下

由此可知,Align表示当前布局在父组件中的位置,Min表示位置尽可能小,Max表示位置尽可能大。

相关推荐
程序员爱钓鱼15 小时前
Rust where详解:让泛型与Trait约束更加清晰
前端·后端·rust
Flynt1 天前
就编译了一下代码,浏览器密码没了——Rust 生态遭遇史上最狠供应链攻击
安全·rust·开源
NutShell Wang1 天前
Rust 1.97 实战迁移:v0 符号重整、Cargo 警告治理与位运算新 API
人工智能·后端·性能优化·rust·vibe coding
进哥AI研习社1 天前
AtomCode 源码编译与二次开发入门:从 Clone 仓库到自定义 Agent 工具的完整指南
rust·二次开发·源码编译·atomcode·agent 工具·tool 扩展·ai 编码智能体
程序员爱钓鱼2 天前
Rust 泛型 Generics详解:编写可复用且类型安全的代码
后端·面试·rust
SomeB1oody2 天前
【RustyML入门】6.0. 数学工具
开发语言·后端·机器学习·rust·教程
今天AI了吗2 天前
从聊天到委派:AI Agent 如何推进长期任务
数据库·人工智能·python·sql·rust
梦醒沉醉2 天前
std1.97.1——fmt模块总览
rust
SomeB1oody3 天前
【RustyML入门】5.3. 聚类指标
开发语言·后端·机器学习·rust·教程
雾沉川3 天前
Rust IDE 选型:除 VS Code 之外,RustRover 非商业场景可免费使用
ide·vscode·rust