I'm using gtk-rs with GTK4. I have a custom widget representing a row in a GtkListView widget. My custom widget (MyRow) is defined exactly as done in the book (see https://github.com/gtk-rs/gtk4-rs/tree/master/book/listings/todo/1/task_row).
I want to create a binding between a property of the object contained in the model and the row widget. Following the principle of the other bindings, I have done the following:
let my_binding = object
.bind_property("my-property", &self, "css-classes")
.sync_create()
.build();
However, I get the following error on compilation:
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
The required argument type is T : ObjectType. I also tried with &self.imp(). I'm confused as to why this doesn't work, since ObjectType is supposedly implemented for all subclasses of glib::Object, which MyRow definitely is (or is it?).
What would be the correct argument to pass, and why?
This is basically a duplicate of the question In rust and gtk4, why does not gtk::Label satisfy gtk::Widget?
GTK object inheritance is not a Rust feature, so an explicit cast is needed. The argument I had to pass was
&self.clone().upcast::<Widget>(). Cloning is not costly as per the docs, it only increments a reference counter.EDIT:
In my function,
selfwas already a reference i.e.&self. As such, by using&selfit became&&selfwhich isn't what's needed here. So using onlyselfworks. Also, in my answer above, the cast is not actually necessary,&self.clone()also works.