我正在尝试保持std::vectorGtk::Widget,我正在显示(并且可能会在Gtk::Container s之间移动)。

目前,我保留了一个Gtk::Notebook,它基本上是std::vector的一对一映射,但是如果我在小部件周围使用Glib::RefPtr,则在从笔记本中删除小部件时会遇到问题。在将其添加到笔记本中时,我已经必须使用“hack”来获取指向基础Gtk对象的指针,并且我怀疑从容器中删除对象时,Notebook容器会释放/删除该对象。

我已经定义了我的小部件 vector ,如下所示:std::vector<Glib::RefPtr<Gtk::Widget>> widgets;
当我向 vector 和笔记本添加小部件时,我会执行以下操作:

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是否可以?

相关(相同的断言失败):Destructing Glib::RefPtr causes failed assertions in the GTK 3 core

最佳答案

不幸的是,您无法执行此操作,因为Gtk::Notebook拥有子对象的所有权。您必须重构代码以使用Gtk::Notebook本身而不是vector来访问小部件,例如 Gtk::Notebook::get_nth_page()

关于c++ - Gtkmm:将RefPtr与保存在std::vector中的小部件一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22373506/

10-16 07:58