gtk4-rs开发:如何解决`ObjectImplRef<imp::Window>: IsA<gtk4::Window>`约束错误?
问题解决:gtk4-rs中FileDialog::select_folder的类型不匹配错误
问题根源
你在ObjectImpl的constructed方法中,错误地将子类实现的Window结构体实例(self)直接传递给select_folder,但该实例并不满足IsA<gtk4::Window>的 trait 约束。只有通过glib::wrapper!生成的公开Window类型(主文件中定义的super::Window)才继承自gtk::ApplicationWindow,符合select_folder对父窗口参数的类型要求。
修复代码
修改imp.rs中的constructed方法,通过self.obj()获取对应的wrapper对象(即公开的Window实例):
impl ObjectImpl for Window { fn constructed(&self) { // Call "constructed" on parent self.parent_constructed(); // 获取wrapper生成的Window对象,而非子类实现的结构体实例 let window = self.obj(); self.file_button.connect_clicked(glib::clone!( #[weak] window, move|_|{ let dialog = FileDialog::builder() .title("choose a directory") .accept_label("confirm") .modal(true) .build(); dialog.select_folder(Some(&window), gio::Cancellable::NONE, |path|{ if let Ok(filepath) = path { println!("{}", filepath.path().unwrap().to_string_lossy()); } }); } )); } }
说明
self.obj()是ObjectImpl trait提供的内置方法,用于从子类实现实例获取对应的glib对象实例(也就是主文件中定义的Window类型)。该类型继承自gtk::ApplicationWindow,天然满足IsA<gtk4::Window>的约束,能够正确作为父窗口参数传递给select_folder。
内容的提问来源于stack exchange,提问作者Pining Doggie
相关产品推荐
相关产品推荐

