[英]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.