0

DrawingArea每次调用该draw()函数时,我都想刷新 a 。我已经阅读了 DrawingArea 的更新绘图功能,所以我知道在连接新绘图信号之前我需要断开旧绘图信号。DrawingArea有方法disconnect(id: SignalHandlerId),所以这段代码编译,但不显示绘图:

let id = drawing_area.connect_draw(move |_, cr| {
    // drawing
});
drawing_area.disconnect(id);

当我尝试保存 id 以在连接新信号之前断开旧信号时,我需要明确声明idSignalHandlerId

extern crate cairo;
extern crate gio;
extern crate gtk;

use gtk::prelude::*;

pub struct DrawingMechanism {
    id: gtk::glib::signal::SignalHandlerId,
    used: bool,
}

impl DrawingMechanism {
    pub fn draw(&self, drawing_area: &gtk::DrawingArea) {
        if self.used {
            drawing_area.disconnect(self.id);
        } else {
            self.used = true; // first call doesn`t have old id
        }

        self.id = drawing_area.connect_draw(move |_, cr| {
            // drawing
        });
    }
}

问题是:编译器告诉我这gtk::glib是私有的,所以我不能使用它。如果我尝试添加 glib 板条箱并使用它而不是gtk::glib,编译器会告诉我我正在使用glib::SignalHandlerIdDrawingArea::connect_draw()返回的是glib::signal::SignalHandlerId.

如何声明id变量以便存储旧的信号 ID?

编辑:这只是版本不匹配,我试图使用glibversion 0.9.0,但gtk正在使用0.8.2.

4

0 回答 0