gtk-rs中StackSwitcher按钮宽度设置、位置调整及外观自定义问题
解决Gtk-rs中StackSwitcher的宽度调整、底部定位及外观自定义问题
1. 修复"No property named width"错误并缩小按钮宽度
你直接给StackSwitcher设置width属性才会报错——这个组件本身没有该属性,得针对它内部的GtkButton子组件来设置样式。
直接用CSS选中StackSwitcher里的按钮,通过min-width/max-width控制宽度,配合内边距进一步缩小视觉尺寸:
use gtk::prelude::*; use gtk::{ApplicationWindow, CssProvider, StyleContext}; use gtk::StackTransitionType::SlideLeftRight; pub fn home_box(window: &ApplicationWindow) { let container = gtk::Box::new(gtk::Orientation::Vertical, 100); window.set_child(Some(&container)); let stack = gtk::Stack::new(); stack.set_transition_type(SlideLeftRight); stack.set_transition_duration(200); // 原有的页面添加代码不变 let home_label = gtk::Label::new(Some("Home")); stack.add_titled(&home_label, None, "Home"); let label1 = gtk::Label::new(Some("placeholder")); stack.add_titled(&label1, None, "placeholder"); let label2 = gtk::Label::new(Some("placeholder2")); stack.add_titled(&label2, None, "placeholder2"); let label3 = gtk::Label::new(Some("Settings")); stack.add_titled(&label3, Some("Settings"), "Settings"); let stack_switcher = gtk::StackSwitcher::new(); stack_switcher.set_stack(Some(&stack)); // 加载并应用自定义CSS let css_provider = CssProvider::new(); css_provider.load_from_data( b" stackswitcher button { min-width: 60px; max-width: 100px; padding: 4px 8px; } " ); StyleContext::add_provider_for_display( &window.display(), &css_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION, ); container.append(&stack_switcher); container.append(&stack); window.present(); }
2. 将StackSwitcher移至屏幕底部
你的容器是垂直Box,默认从上到下排列。只需要让上方的Stack组件占据所有剩余垂直空间,就能把StackSwitcher挤到底部:
// 调整添加顺序,先加Stack并设置expand为true stack.set_expand(true); container.append(&stack); container.append(&stack_switcher); // 或者保持原顺序,给Stack设置expand即可: // container.append(&stack_switcher); // stack.set_expand(true); // container.append(&stack);
3. StackSwitcher外观自定义常用方法
CSS样式定制
除了宽度,还能通过CSS改这些样式:
- 选中/未选中状态:修改背景色、文字色
stackswitcher button { background-color: #f0f0f0; color: #333; border-radius: 4px; } stackswitcher button:checked { background-color: #2196f3; color: white; } - 字体与间距:调整按钮文字样式、按钮间距离
stackswitcher { spacing: 8px; /* 按钮之间的间隔 */ } stackswitcher button label { font-size: 14px; font-weight: 500; } - 边框样式:给按钮加边框或圆角
stackswitcher button { border: 1px solid #ddd; border-radius: 6px; }
代码层面调整
- 自定义按钮内容:不用默认文字按钮,自己做带图标或复杂布局的按钮
// 示例:带图标的切换按钮 let custom_btn = gtk::Box::new(gtk::Orientation::Horizontal, 4); let icon = gtk::Image::from_icon_name(Some("home-symbolic")); let label = gtk::Label::new(Some("首页")); custom_btn.append(&icon); custom_btn.append(&label); // 用add_child替代add_titled,传入自定义按钮 stack.add_child(&home_label, Some(&custom_btn)); - 调整排列方向:把按钮改成垂直排列
stack_switcher.set_orientation(gtk::Orientation::Vertical);
内容的提问来源于stack exchange,提问作者John554
相关产品推荐
相关产品推荐

