繁体   English   中英

如何在 GObject 中存储没有默认值的 Rust 对象

[英]How to store Rust object without Default in GObject

我基本上是按照gtk-rs 这本书来创建一个简单的应用程序。 我有以下 rust 结构,我想在 ListView 中显示。 这个结构基本上是只读的,不应该被编辑,所以我不想将它的成员公开为属性,我也不想从 GTK 本身创建它(它是在 rust-only 业务逻辑中创建的)。 我想将整个结构公开为一个属性。

pub struct Video {
    pub number: u32,
    pub encoding: Encoding,
    pub chapters: Vec<Chapter>,
}

pub struct Chapter {
    pub number: u32,
    pub filename: String,
    pub thumbnail_filename: Option<String>,
    pub preview_video_filename: Option<String>,
}

如何将其包装在 GObject 中? 我正在尝试创建以下包装器:

mod imp {
    #[derive(Default)]
    pub struct VideoObject {
        pub data: Rc<RefCell<Video>>,
    }

    #[glib::object_subclass]
    impl ObjectSubclass for VideoObject {
        const NAME: &'static str = "VideoObject";
        type Type = super::VideoObject;
    }
    impl ObjectImpl for VideoObject {}

}

pub const VIDEO_PROPERTY: &str = "video";

glib::wrapper! {
    pub struct VideoObject(ObjectSubclass<imp::VideoObject>);
}

impl VideoObject {
    pub fn new(video: Video) -> Self {
        Object::new(&[]).expect("Could not create VideoObject")
    }
}

这失败了,因为 Video 没有实现 Default。 我考虑将它包装在一个Option中,例如data: Rc<RefCell<Option<Video>>> ,它可以编译。 不幸的是,然后我坚持如何将其设置为属性。

我想一种方法是使用ParamSpecPointer 、 box 和泄漏Video然后再通过它,但这让我觉得不安全和丑陋......

有更好的方法吗?

您可以直接访问“imp”对象并手动设置字段。 无需将所有内容都转换为 GObject 属性:

impl VideoObject {
    pub fn new(video: Video) -> Self {
        let object = Object::new(&[]).unwrap();
        let imp = imp::VideoObject::from_instance(&object);
        imp.data.replace(Some(video));
        object
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM