我正在尝试保留std::vector
Gtk::Widget
我正在展示(并且可能会)在Gtk::Container
之间移动的Gtk::Notebook
。
目前我保留std::vector
这基本上是Glib::RefPtr
的一对一地图,但如果我在小部件周围使用std::vector<Glib::RefPtr<Gtk::Widget>> widgets;
,我会在删除时遇到问题笔记本中的小部件。当我将它添加到笔记本中时,我已经必须使用'hack'来获取指向底层Gtk对象的指针,并且我怀疑当我从容器中移除它时,Notebook容器会释放/删除该对象。
我已经定义了这样的小部件向量:
Glib::RefPtr<Gtk::Widget> w (new Gtk::Widget());
widgets.push_back (w);
Gtk::Widget *wptr = w.operator->(); // hack
notebook.append_page (*wptr);
当我向矢量和笔记本添加小部件时:
int c = 1; // widget no. to remove
notebook.remove_page (c);
auto it = widgets.begin() + c;
widgets.erase (it);
当我尝试删除它时:
G_IS_OBJECT
但是这会导致std::vector
失败断言(我认为)iterator
中的元素在notebook.remove_page()
(函数结束)结束时被清除,因为可能RefPtr
已经释放了该对象。我怎样才能做到这一点?是{{1}}的可能吗?
相关(相同的断言失败):Destructing Glib::RefPtr causes failed assertions in the GTK 3 core
答案 0 :(得分:3)
油嘴:: RefPtr&LT;&GT;不应该与小部件一起使用。它不是通用的智能指针。它应该只用于强制你使用它的类 - 没有公共构造函数但是有公共的create *()方法。
答案 1 :(得分:1)
不幸的是,你不能这样做,因为Gtk::Notebook
取得了子对象的所有权。您必须重构代码才能使用Gtk::Notebook
本身来访问小部件而不是vector
,例如使用Gtk::Notebook::get_nth_page()
。