rust 自定义GTK小部件中的绑定属性,尽管是小部件,但`self`不实现ObjectType [重复]

pexxcrt2  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(124)

此问题已在此处有答案

In rust and gtk4, why does not gtk::Label satisfy gtk::Widget?(1个答案)
上个月关门了。
我使用gtk-rs与gtk 4。我有一个表示GtkListView小部件中的一行的自定义小部件。我的自定义小部件(MyRow)完全按照书中的方法定义(参见https://github.com/gtk-rs/gtk4-rs/tree/master/book/listings/todo/1/task_row)。
我想在模型中包含的对象的属性和行小部件之间创建一个绑定。遵循其他绑定的原则,我做了以下工作:

let my_binding = object
    .bind_property("my-property", &self, "css-classes")
    .sync_create()
    .build();

字符串
但是,我在编译时得到以下错误:

error[E0277]: the trait bound `&my_row::MyRow: gtk4::prelude::ObjectType` is not satisfied
    --> src/my_row.rs:120:42
     |
120  |             .bind_property("my-property", &self, "css-classes")
     |              -------------                ^^^^^ the trait `gtk4::prelude::ObjectType` is not implemented for `&my_row::MyRow`
     |              |
     |              required by a bound introduced by this call


所需的参数类型为T : ObjectType。我也试过&self.imp()。我很困惑为什么这不起作用,因为ObjectType应该是为glib::Object的所有子类实现的,而MyRow肯定是(或者是吗?)).

正确的参数是什么,为什么?

91zkwejq

91zkwejq1#

这基本上是问题In rust and gtk4, why does not gtk::Label satisfy gtk::Widget?的重复
GTK对象继承不是Rust特性,因此需要显式转换。我必须传递的参数是&self.clone().upcast::<Widget>()。根据文档,克隆并不昂贵,它只增加了引用计数器。

编辑:

在我的函数中,self已经是一个引用,即因此,通过使用&self,它变成了&&self,这不是这里所需要的。所以只能使用self。另外,在我上面的回答中,强制转换实际上不是必需的,&self.clone()也可以工作。

相关问题