Builder derived widgets with properties -- error validate_and_install_class_property: assertion 'class->set_property != NULL' failed



I have a glade file from which I load a derived widget that has a Glib::Property.  When I load the main window, I get the following error:

```

GLib-GObject-CRITICAL **: validate_and_install_class_property: assertion 'class->set_property != NULL' failed

```

I have created a simplified example, as per this page: https://developer-old.gnome.org/gtkmm-tutorial/stable/sec-builder-using-derived-widgets.html.en, using a derived Gtk::Button and still see the error.

I have included Glib::ObjectBase() in the initializer list of the derived widget and called the default constructor which also has a the Glib::ObjectBase() to initialize the Gtype (), but I still see the error.


Additionally, the property appears to work, in that I can connect to the signal_changed and set/get the property value as expected, but still receive the error at runtime.


Simplified example:

```

#include <iostream>
#include <gtkmm.h>

Glib::ustring glade_str =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<!-- Generated with glade 3.38.2 -->\n"
"<interface>\n"
"  <requires lib=\"gtk+\" version=\"3.24\"/>\n"
"  <object class=\"GtkWindow\" id=\"mainwindow\">\n"
"    <property name=\"can-focus\">False</property>\n"
"    <child>\n"
"      <object class=\"GtkButton\" id=\"btn\">\n"
"        <property name=\"label\" translatable=\"yes\">button</property>\n"
"        <property name=\"visible\">True</property>\n"
"        <property name=\"can-focus\">True</property>\n"
"        <property name=\"receives-default\">True</property>\n"
"      </object>\n"
"    </child>\n"
"  </object>\n"
"</interface>";

class DerivedButtonProp : public Gtk::Button {
public:
    static void ensure_type()
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        static_cast<void>(DerivedButtonProp());
    }

    DerivedButtonProp(BaseObjectType *obj, Glib::RefPtr<Gtk::Builder> const &builder)
            : Glib::ObjectBase(s_type_name),
              Gtk::Button(obj),
              prop_mynum(*this, "mynumprop")
    {
        std::cout << __PRETTY_FUNCTION__  << std::endl;
    }

    virtual ~DerivedButtonProp() = default;

    Glib::PropertyProxy<int> mynum() { return prop_mynum.get_proxy(); };

private:
    DerivedButtonProp()
            : Glib::ObjectBase(s_type_name),
              prop_mynum(*this, "mynumprop")
    {
        std::cout << __PRETTY_FUNCTION__  << std::endl;
    };

    static constexpr auto s_type_name = "DerivedButtonProp";
    Glib::Property<int> prop_mynum;
};

class App : public Gtk::Window {
public:
    App()
    {

    }

    App(BaseObjectType *obj, Glib::RefPtr<Gtk::Builder> const & builder)
            : Gtk::Window(obj)
    {
        builder->get_widget_derived("btn", btn_derprop);
    }

    virtual ~App() = default;

protected:
    DerivedButtonProp *btn_derprop = nullptr;

};


App* pWindow = nullptr;
Glib::RefPtr<Gtk::Application> app;

int main(int argc, char *argv[])
{
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create();
    DerivedButtonProp::ensure_type();
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_string(glade_str);

    App *pWindow = nullptr;
    builder->get_widget_derived("mainwindow", pWindow);
    app->run(*pWindow);
}

```



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]