使用 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()
。
这是我一直在研究的一些代码(在 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()
。