// Attributes available to this derive:
Expand description

Derive macro for using a composite template in a widget.

The template attribute specifies where the template should be loaded from; it can be a file, a resource, or a string.

The template_child attribute is used to mark all internal widgets we need to have programmatic access to.


Specify that MyWidget is using a composite template and load the template file the composite_template.ui file.

Then, in the ObjectSubclass implementation you will need to call bind_template in the class_init function, and init_template in instance_init function.

use gtk::prelude::*;
use gtk::glib;
use gtk::subclass::prelude::*;

mod imp {
    use super::*;

    #[derive(Debug, Default, gtk::CompositeTemplate)]
    #[template(file = "composite_template.ui")]
    pub struct MyWidget {
        pub label: TemplateChild<gtk::Label>,
        #[template_child(id = "my_button_id")]
        pub button: TemplateChild<gtk::Button>,

    impl ObjectSubclass for MyWidget {
        const NAME: &'static str = "MyWidget";
        type Type = super::MyWidget;
        type ParentType = gtk::Box;

        fn class_init(klass: &mut Self::Class) {

        fn instance_init(obj: &glib::subclass::InitializingObject<Self>) {

    impl ObjectImpl for MyWidget {}
    impl WidgetImpl for MyWidget {}
    impl ContainerImpl for MyWidget {}
    impl BoxImpl for MyWidget {}

glib::wrapper! {
    pub struct MyWidget(ObjectSubclass<imp::MyWidget>) @extends gtk::Widget, gtk::Container, gtk::Box;

impl MyWidget {
    pub fn new() -> Self {
        glib::Object::new(&[]).expect("Failed to create an instance of MyWidget")