gpt4 book ai didi

c++ - Gtkmm:将 RefPtr 与保存在 std::vector 中的小部件一起使用

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:36 24 4
gpt4 key购买 nike

我正在尝试保留 std::vectorGtk::Widget我正在展示(并且可能会)在 Gtk::Container 之间移动

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

我已经定义了我的小部件 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

最佳答案

Glib::RefPtr<> 不应与小部件一起使用。它不是通用智能指针。它应该只与强制您使用它的类一起使用 - 通过没有公共(public)构造函数但具有公共(public) create*() 方法。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com