Отображение нескольких наложенных виджетов
Я пытаюсь отобразить несколько рисунков Каира, накладывающихся друг на друга:
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
Класс предназначен именно для этой цели, чтобы показать перекрывающиеся виджеты. Я не могу найти способ отобразить вторую перекрывающуюся область рисования.
2 ответа
добавляет виджет в оверлей в качестве основного дочернего элемента - у вас может быть только один из них. Он унаследован от класса контейнера в более старых версиях gtkmm (который, как я полагаю, вы используете) и заменен на
set_child
в gtkmm 4 (который больше не наследуется от
Gtk::Container
).
это
Gtk::Overlay
особый метод, который позволяет добавлять любое количество виджетов, которые будут отображаться поверх дочернего виджета.
Попробуйте заменить второй
add
метод с
add_overlay
и он должен работать.
Первое: я понятия не имею, что я здесь делаю.
Я просто спросил Google для 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));