You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:07:53