IsA 用于 GTK Rust 中的子类

问题描述 投票:0回答:0

我正在尝试在 Rust GTK 应用程序中弹出文件对话框。窗口子类 gtk::ApplicationWindow,但是当我尝试使用它打开对话框时出现错误

error[E0277]: the trait bound `options::imp::Options: gtk4::prelude::IsA<gtk4::Window>` is not satisfied
   --> src/options/mod.rs:126:17
    |
124 |             let file_chooser = FileChooserDialog::new(
    |                                ---------------------- required by a bound introduced by this call
125 |                 Some("Open File"),
126 |                 Some(self),
    |                 ^^^^^^^^^^ the trait `gtk4::prelude::IsA<gtk4::Window>` is not implemented for `options::imp::Options`
    |
    = help: the following other types implement trait `gtk4::prelude::IsA<T>`:
              <ATContext as gtk4::prelude::IsA<ATContext>>
              <ATContext as gtk4::prelude::IsA<gtk4::glib::Object>>
              <AboutDialog as gtk4::prelude::IsA<AboutDialog>>
              <AboutDialog as gtk4::prelude::IsA<Accessible>>
              <AboutDialog as gtk4::prelude::IsA<Buildable>>
              <AboutDialog as gtk4::prelude::IsA<ConstraintTarget>>
              <AboutDialog as gtk4::prelude::IsA<Native>>
              <AboutDialog as gtk4::prelude::IsA<Root>>
            and 1758 others

选项是一个窗口:

glib::wrapper! {
    pub struct Options(ObjectSubclass<imp::Options>)
    @extends gtk::Widget, gtk::Window, gtk::ApplicationWindow, @implements gio::ActionMap, gio::ActionGroup;
}

但我不确定如何说服油嘴滑舌。这通常是如何处理的?将 IsA 特性添加到 Option 是否可行?我玩过它但找不到任何可以编译的东西。一种解决方案可能是将 Options 更改为一个框,然后将其作为 Window 的子项包含在内,但我认为必须有一种方法可以做到这一点,我想学习它。

有打开 FileChooser 的示例代码,但它使用的是 Window,而不是子类。我尝试制作一个新窗口并使用它 - 它确实弹出对话框(和一个小的空白窗口,在背景中),但无法获得焦点 - 焦点保留在原始窗口,即使我尝试抓住它新窗口或对话框。 目前我改为 FileChooserNative,它可以工作(它不需要小部件),但我之前遇到过类似的问题,想更好地了解发生了什么。

rust gtk glib
© www.soinside.com 2019 - 2024. All rights reserved.