显示多个叠加的小部件
Display multiple overlaying widgets
我正在尝试显示多个相互重叠的 cairo 绘图:
extern crate cairo;
extern crate gio;
extern crate gtk;
use std::f64::consts::PI;
use gio::prelude::*;
use gtk::prelude::*;
use gtk::DrawingArea;
use std::env::args;
fn build_ui(application: >k::Application) {
let window = gtk::ApplicationWindow::new(application);
window.set_default_size(300, 300);
let overlay = gtk::Overlay::new();
// Draw first circle
let drawing_area1 = Box::new(DrawingArea::new)();
drawing_area1.connect_draw(|_, ctx| draw(ctx, 0.5, 0.4));
overlay.add(&drawing_area1);
// Draw second circle
let drawing_area2 = Box::new(DrawingArea::new)();
drawing_area2.connect_draw(|_, ctx| draw(ctx, 0.2, 1.0));
overlay.add(&drawing_area2);
window.add(&overlay);
window.show_all();
}
fn draw(ctx: &cairo::Context, width: f64, color: f64) -> Inhibit {
ctx.scale(300., 300.);
ctx.arc(0.5, 0.5, width, 0.0 * PI, 2.0 * PI);
ctx.set_source_rgba(color, 0.0, 0.0, 0.8);
ctx.fill_preserve();
Inhibit(false)
}
fn main() {
let application =
gtk::Application::new(Some("example.overlay"), Default::default())
.expect("Initialization failed...");
application.connect_activate(|app| {
build_ui(app);
});
application.run(&args().collect::<Vec<_>>());
}
运行 这段代码给了我这个警告:
(test_overlay_gtk:25534): Gtk-WARNING **: 19:12:05.573: Attempting to add a widget with type GtkDrawingArea to a GtkOverlay, but as a GtkBin subclass a GtkOverlay can only contain one widget at a time; it already contains a widget of type GtkDrawingArea
我了解到 overlay
对象只能显示一个绘图区域。我认为 overlay
class 就是为了这个目的,显示重叠的小部件。我找不到显示第二个重叠绘图区域的方法。
首先:我不知道我在这里做什么。
我只是向 Google 询问 GtkOverlay 并找到此页面:https://developer.gnome.org/gtk3/stable/GtkOverlay.html
gtk_overlay_add_overlay
的文档说:
Adds widget to overlay.
The widget will be stacked on top of the main widget added with gtk_container_add().
所以,显然有一个主小部件 .add()
和叠加层 .add_overlay()
。
对于您的示例代码:您不能只将两个图形绘制到同一个叠加小部件吗?像 drawing_area1.connect_draw(|_, ctx| draw(ctx, 0.5, 0.4); draw(ctx, 0.2, 1.0));
add
将小部件作为主要子项添加到叠加层 - 您只能拥有其中一个。这是从旧版本的 gtkmm(我假设您正在使用)中的容器 class 继承的,并在 gtkmm 4 中被 set_child
取代(不再从 add
继承 Gtk::Container
).
add_overlay
是 Gtk::Overlay
特定方法,允许您添加任意数量的小部件以显示在子小部件的顶部。
尝试用 add_overlay
替换第二个 add
方法,它应该可以工作。
我正在尝试显示多个相互重叠的 cairo 绘图:
extern crate cairo;
extern crate gio;
extern crate gtk;
use std::f64::consts::PI;
use gio::prelude::*;
use gtk::prelude::*;
use gtk::DrawingArea;
use std::env::args;
fn build_ui(application: >k::Application) {
let window = gtk::ApplicationWindow::new(application);
window.set_default_size(300, 300);
let overlay = gtk::Overlay::new();
// Draw first circle
let drawing_area1 = Box::new(DrawingArea::new)();
drawing_area1.connect_draw(|_, ctx| draw(ctx, 0.5, 0.4));
overlay.add(&drawing_area1);
// Draw second circle
let drawing_area2 = Box::new(DrawingArea::new)();
drawing_area2.connect_draw(|_, ctx| draw(ctx, 0.2, 1.0));
overlay.add(&drawing_area2);
window.add(&overlay);
window.show_all();
}
fn draw(ctx: &cairo::Context, width: f64, color: f64) -> Inhibit {
ctx.scale(300., 300.);
ctx.arc(0.5, 0.5, width, 0.0 * PI, 2.0 * PI);
ctx.set_source_rgba(color, 0.0, 0.0, 0.8);
ctx.fill_preserve();
Inhibit(false)
}
fn main() {
let application =
gtk::Application::new(Some("example.overlay"), Default::default())
.expect("Initialization failed...");
application.connect_activate(|app| {
build_ui(app);
});
application.run(&args().collect::<Vec<_>>());
}
运行 这段代码给了我这个警告:
(test_overlay_gtk:25534): Gtk-WARNING **: 19:12:05.573: Attempting to add a widget with type GtkDrawingArea to a GtkOverlay, but as a GtkBin subclass a GtkOverlay can only contain one widget at a time; it already contains a widget of type GtkDrawingArea
我了解到 overlay
对象只能显示一个绘图区域。我认为 overlay
class 就是为了这个目的,显示重叠的小部件。我找不到显示第二个重叠绘图区域的方法。
首先:我不知道我在这里做什么。
我只是向 Google 询问 GtkOverlay 并找到此页面:https://developer.gnome.org/gtk3/stable/GtkOverlay.html
gtk_overlay_add_overlay
的文档说:
Adds widget to overlay.
The widget will be stacked on top of the main widget added with gtk_container_add().
所以,显然有一个主小部件 .add()
和叠加层 .add_overlay()
。
对于您的示例代码:您不能只将两个图形绘制到同一个叠加小部件吗?像 drawing_area1.connect_draw(|_, ctx| draw(ctx, 0.5, 0.4); draw(ctx, 0.2, 1.0));
add
将小部件作为主要子项添加到叠加层 - 您只能拥有其中一个。这是从旧版本的 gtkmm(我假设您正在使用)中的容器 class 继承的,并在 gtkmm 4 中被 set_child
取代(不再从 add
继承 Gtk::Container
).
add_overlay
是 Gtk::Overlay
特定方法,允许您添加任意数量的小部件以显示在子小部件的顶部。
尝试用 add_overlay
替换第二个 add
方法,它应该可以工作。