此问题已在此处有答案:
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
肯定是(或者是吗?)).
正确的参数是什么,为什么?
1条答案
按热度按时间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()
也可以工作。