首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新DrawingArea的绘图函数

更新DrawingArea的绘图函数
EN

Stack Overflow用户
提问于 2019-10-13 04:02:14
回答 1查看 243关注 0票数 0

我想在DrawingArea中更新一个cairo绘图。我试图通过使用新函数作为参数来调用DrawingArea::connect_draw(...)来实现这一点。我的问题是,它不会替换原来的绘图函数,而是在显示窗口时同时调用这两个函数。下面是一个例子

代码语言:javascript
复制
extern crate cairo;
extern crate gio;
extern crate gtk;

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

fn main() {
    let application = gtk::Application::new(Some("com.example"), Default::default())
        .expect("Initialization failed...");

    application.connect_activate(|app| {
        build_ui(app);
    });

    application.run(&vec![]);
}

fn build_ui(application: &gtk::Application) {
    let window = get_window(application);
    let drawing_area = Box::new(gtk::DrawingArea::new)();

    // Set drawing function
    drawing_area.connect_draw(|_, ctx| draw(ctx, 0.5, 2.0));
    // Change drawing function
    drawing_area.connect_draw(|_, ctx| draw(ctx, 0.9, 1.0)); // <-- Why is this not working as expected?

    window.add(&drawing_area);
    window.show_all();
}

fn get_window(application: &gtk::Application) -> gtk::ApplicationWindow {
    let window = gtk::ApplicationWindow::new(application);
    window.set_default_size(500i32, 500i32);

    // Set transparency
    set_visual(&window, None);
    window.connect_screen_changed(set_visual);
    window.set_app_paintable(true);

    window
}

fn draw(ctx: &cairo::Context, param1: f64, param2: f64) -> gtk::Inhibit {
    ctx.scale(500f64, 500f64);

    ctx.set_source_rgba(1.0, 0.2, 0.2, param1);
    ctx.arc(0.5, 0.5, 0.2, 0.0, 3.1414 * param2);
    ctx.fill();

    Inhibit(false)
}

fn set_visual(window: &gtk::ApplicationWindow, _screen: Option<&gdk::Screen>) {
    if let Some(screen) = window.get_screen() {
        if let Some(ref visual) = screen.get_rgba_visual() {
            window.set_visual(Some(visual));
        }
    }
}

我希望显示半个圆圈。然而,尽管我试图取代connect_draw,但旧的、完整的循环仍然存在。我怎样才能正确地替换它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-13 04:37:37

使用connect_draw函数可以附加另一个信号处理程序,但不会替换现有的处理程序。但是,该函数返回一个SignalHandlerId,然后您应该能够使用它通过signal_handler_disconnect函数(参见https://gtk-rs.org/docs/glib/signal/fn.signal_handler_disconnect.html)断开原始信号处理程序的连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58358008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档