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表示位置尽可能大。

相关推荐
喵了几个咪4 小时前
RushWind Admin — 契约驱动:203 条路由零手写的工程化拆解
微服务·rust·开源·admin
Ramble_Naylor4 小时前
闭包与迭代器:函数式写法
rust
喵了几个咪7 小时前
Go 写业务,Rust 扛底盘:一套可落地的混合架构
微服务·架构·golang·rust·多租户·gowind·rushwind
对象存储与RustFS1 天前
升级 RustFS 二进制不停机:一条一条换,留一条退路
后端·rust·开源
感谢地心引力1 天前
来试试我做的音乐播放器吧
ai·rust·音乐·navidrome·music·tarui
蚂蚁背大象1 天前
RocketMQ-Rust 1.0.0 发布:用 Rust 做消息队列,这次有哪些变化?
rust·开源·rocketmq
喵个咪1 天前
RushWind Admin — 用 Rust 写的企业级中后台,开源了
后端·rust·开源
喵个咪1 天前
RushWind Admin — 契约驱动:203 条路由零手写的工程化拆解
后端·rust·开源
喵个咪1 天前
Go 写业务,Rust 扛底盘:一套可落地的混合架构
后端·rust·go
孙启超1 天前
【AI开发之Rust】第 22 课:一键多平台与工程收尾 —— CI、发布检查与结课
开发语言·后端·rust