1

我正在尝试显示多个相互重叠的 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: &gtk::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类正是为了这个目的,显示重叠的小部件。我找不到显示第二个重叠绘图区域的方法。

4

2 回答 2

1

add将小部件作为主要子元素添加到叠加层 - 您只能拥有其中一个。set_child这是从旧版本的 gtkmm(我假设您正在使用)中的容器类继承的,并在 gtkmm 4(不再继承add自)中被替换Gtk::Container

add_overlayGtk::Overlay允许您添加任意数量的小部件以显示在子小部件之上的特定方法。

尝试用您的第二种add方法替换add_overlay它应该可以工作。

于 2021-02-16T13:02:16.163 回答
0

第一:我不知道我在这里做什么。

我只是向谷歌询问了 GtkOverlay 并找到了这个页面:https ://developer.gnome.org/gtk3/stable/GtkOverlay.html

的文档gtk_overlay_add_overlay说:

将小部件添加到叠加层。

小部件将堆叠在使用 gtk_container_add() 添加的主小部件之上。

所以,显然有一个主要的小部件,你可以.add()覆盖它.add_overlay()

对于您的示例代码:您不能将两张图绘制到同一个覆盖小部件上吗?就像是drawing_area1.connect_draw(|_, ctx| draw(ctx, 0.5, 0.4); draw(ctx, 0.2, 1.0));

于 2019-07-24T13:30:37.540 回答