使用 GTK+,如何在创建框后将标签添加到框?

Using GTK+, how do I add a Label to a Box after it's created?

这是我一直在研究的一些代码(在 Rust 中,使用优秀的 gtk-rs 绑定):

use gtk;
use gtk::prelude::*;

struct LabelViewer {
    pub container: gtk::ScrolledWindow,
    layout: gtk::Box,
    fields: Vec<gtk::Label>,
}
impl LabelViewer {  
    pub fn new() -> Self {
        let container = gtk::ScrolledWindow::new(None, None);
        let layout = gtk::Box::new(gtk::Orientation::Vertical, 5);
        container.add(&layout);
        LabelViewer {
            container: container,
            layout: layout,
            fields: Vec::new(),
        }
    }
    pub fn set_labels(&mut self, labels: &[String]) {
        for label in self.fields.drain(..) {
            self.layout.remove(&label);
        }
        for label in labels.iter().map(|l| gtk::Label::new(Some(l))) {
            self.layout.pack_start(&label, false, false, 0);
            self.fields.push(label);
        }
    }
}

当我创建一个 LabelViewer 并将其容器添加到我的 Window 时,我看到了 ScrolledWindow 的边框,表明它确实被添加了。但是,当我调用 set_labels 时,实际上并没有呈现任何标签。

我有一些 Swing 经验(来自 Java),但这是我第一次使用 GTK。根据我过去的经验,我尝试在调用 set_labels 后使用 queue_draw 使容器无效,但这没有任何效果。它可能不相关,但我调用 set_labels before gtk::main().

新创建的 GtkWidgets 最初是隐藏的。您需要对它们调用 show()show_all() 以使它们可见(后者将递归地显示容器的子级)。这意味着如果您在 window 上调用 show_all() 后添加小部件,则必须自己发出该调用。在您的情况下,您可以为每个标签单独调用 show() 或在添加所有标签后在 self.layout 上调用 show_all()