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

如何在gtk-rs中设置窗口最大尺寸并实现内容适配?

在gtk-rs中限制窗口/组件尺寸的方法

一、限制窗口最大尺寸

你可以直接给ApplicationWindow设置最大宽高,有两种实现方式:

  • 在窗口构建器中通过max_width和max_height属性指定:
    let window = ApplicationWindow::builder()
        .application(app)
        .title("My GTK App")
        .child(&button_box)
        .default_width(360)
        .default_height(720)
        .max_width(800) // 设置窗口最大宽度
        .max_height(1000) // 设置窗口最大高度
        .build();
    
  • 或者在窗口构建完成后调用set_max_size方法:
    window.set_max_size(800, 1000);
    

设置完成后,窗口就不会被拉伸超过指定的最大尺寸。

二、让内容自适应窗口尺寸(添加滚动条)

如果希望内容在窗口尺寸内自适应,避免溢出屏幕,最常用的方式是用ScrolledWindow包裹长内容组件。修改你的代码,将长内容放入滚动窗口中:

// 替换原有标签和容器的构建逻辑
let label = gtk::Label::new(Some("this is a very long string that will change the size of the window to a size that is impossible to use..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."));
// 开启标签自动换行优化显示
label.set_wrap(true);

let scrolled_window = gtk::ScrolledWindow::builder()
    .hscrollbar_policy(gtk::PolicyType::Automatic) // 自动显示水平滚动条
    .vscrollbar_policy(gtk::PolicyType::Automatic) // 自动显示垂直滚动条
    .child(&label)
    .build();

let label_box = gtk::Box::builder()
    .orientation(Orientation::Vertical)
    .margin_top(12)
    .margin_bottom(12)
    .build();
label_box.append(&scrolled_window);

当内容超出滚动窗口的可用空间时,会自动出现滚动条,窗口也不会被过度拉伸。

三、限制任意组件的尺寸

对于任意GTK组件,你可以通过以下方式限制其最大尺寸:

  • 调用组件的set_max_size方法,指定最大宽高(-1表示不限制对应方向):
    // 限制标签的最大宽度,高度不限制
    label.set_max_size(600, -1);
    
  • 对于文本类组件(如Label),可以用set_max_width_chars限制字符宽度,并配合自动换行:
    label.set_max_width_chars(50);
    label.set_wrap(true);
    
  • 利用布局容器的约束,比如在Box中设置组件的expand属性,控制组件是否自动扩展占满容器:
    label_box.append(&label);
    label.set_expand(false); // 不让组件自动扩展占满容器空间
    

修改后的完整代码示例

use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button, Orientation};
const APP_ID: &str = "org.gtk_rs.HelloWorld3";

fn main() {
    let app = Application::builder().application_id(APP_ID).build();
    app.connect_activate(build_ui);
    app.run();
}

fn build_ui(app: &Application) {
    let button = Button::builder()
        .label("Press me!")
        .margin_top(12)
        .margin_bottom(12)
        .margin_start(12)
        .margin_end(12)
        .build();

    let label = gtk::Label::new(Some("this is a very long string that will change the size of the window to a size that is impossible to use..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."));
    label.set_wrap(true);

    let scrolled_window = gtk::ScrolledWindow::builder()
        .hscrollbar_policy(gtk::PolicyType::Automatic)
        .vscrollbar_policy(gtk::PolicyType::Automatic)
        .child(&label)
        .build();

    let label_box = gtk::Box::builder()
        .orientation(Orientation::Vertical)
        .margin_top(12)
        .margin_bottom(12)
        .build();
    label_box.append(&scrolled_window);

    label_box.set_visible(false);

    let button_box = gtk::Box::builder()
        .orientation(Orientation::Vertical)
        .margin_top(12)
        .margin_bottom(12)
        .build();
    button_box.append(&button);
    button_box.append(&label_box);

    let window = ApplicationWindow::builder()
        .application(app)
        .title("My GTK App")
        .child(&button_box)
        .default_width(360)
        .default_height(720)
        .max_width(800)
        .max_height(1000)
        .build();

    window.present();

    button.connect_clicked(move |_| {
        let visible = label_box.get_visible();
        label_box.set_visible(!visible);
        // 隐藏内容后手动恢复窗口默认尺寸
        if !visible {
            window.resize(360, 720);
        }
    });
}

内容的提问来源于stack exchange,提问作者John554

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:10:18