如何在Rust Slint应用中强制设置窗口创建时的尺寸
解决Slint窗口启动时设置指定分辨率的问题
问题分析
你当前代码里尝试通过Weak引用设置窗口尺寸,其实完全没必要绕这个弯——App::new()创建实例后,直接用该实例调用window().set_size()就能在启动时生效。之前的问题源于多余使用Weak的冗余操作,而非Slint的生命周期限制。
两种有效解决方案
方案1:在Slint组件定义中直接指定窗口尺寸(最简洁)
直接在.slint!宏的App组件里添加width和height属性,窗口启动时会直接应用这个尺寸:
slint::slint! { import { Button, VerticalBox, HorizontalBox } from "std-widgets.slint"; export component App inherits Window { // 直接设置初始窗口分辨率 width: 1920px; height: 1080px; in property <bool> data_exists; callback upload_file_clicked <=> upload_btn.clicked; VerticalBox { Text { text: data_exists ? "Found existing data, loading..." : "Please upload an MBOX or JSON file."; } HorizontalBox { upload_btn := Button { text: "Upload"; } } } } }
方案2:在main函数中直接用App实例设置尺寸
去掉多余的Weak引用,直接使用创建好的App实例调用窗口设置方法:
fn main() { let app: App = App::new().unwrap(); let size: PhysicalSize = PhysicalSize::new(1920, 1080); // 直接通过App实例设置窗口尺寸,无需Weak app.window().set_size(size); let upload_weak: Weak<App> = app.as_weak(); app.on_upload_file_clicked(move || { let _app = upload_weak.upgrade().unwrap(); println!("Doing stuff :P"); }); set_app_vars(data_check(), app.as_weak()); app.run().unwrap(); }
额外优化建议
你的data_check函数可以优化:避免重复调用fs::read_dir,同时处理目录读取失败的错误(原代码的unwrap()会在目录不存在时触发panic):
fn data_check() -> bool { match fs::read_dir("storage/") { Ok(paths) => { let entries: Vec<_> = paths.collect(); if !entries.is_empty() { for entry in entries { if let Ok(entry) = entry { println!("Type: {:?}", entry.file_type().unwrap_or_default()); } } true } else { println!("No storage files found."); false } } Err(e) => { println!("Failed to read storage directory: {}", e); false } } }
内容的提问来源于stack exchange,提问作者phaynes
相关产品推荐
相关产品推荐

