LINUX.ORG.RU

Реализация Gio::ListModel, G_IS_LIST_MODEL assertion failed

 , , , ,


0

1

Продолжаю грызть mm-кактус.

class Model: public Gio::ListModel {
    std::vector<Glib::RefPtr<Gtk::Button>> gobjects;

protected:
    Model() = default;
    GType get_item_type_vfunc() override {
        return Gtk::Button::get_type();
    }
    guint get_n_items_vfunc() override {
        return gobjects.size();
    }
    gpointer get_item_vfunc(guint position) override {
        if (position < gobjects.size()) {
            return gobjects[position].get();
        }
        return nullptr;
    }
public:
    static auto create() {
        return Glib::RefPtr<Model>{ new Model{} };
    }
    void add(const Glib::RefPtr<Gtk::Button>& button) {
        gobjects.push_back(button);
        items_changed(gobjects.size(), 0, 1);
    }
};

Реализация сыпет варнингами при вставке

g_list_model_items_changed: assertion 'G_IS_LIST_MODEL (list)' failed

ЧЯДНТ?

Должно было быть так. Нашел на задворках мейлинг-листов, где такой же страдалец пытался TreeModel соорудить. Оказывается,

  1. Нужно обязательно инициализировать ObjectBase, потому что в gtkmm не осилили делать это автоматически;
  2. Важен порядок инициализации: сперва ObjectBase, потом все остальное
  3. Важен порядок наследования: сперва реализуемый интерфейс, и только потом Glib::Object.

Вся эта информация, как водится, нигде в официальной документации не указана, ***тесь как хотите.

class Model: public Gio::ListModel, public Glib::Object {
Model(): Glib::ObjectBase(typeid(Model)), Gio::ListModel() {}
Siborgium ★★★ ()