我有一个客户端在从服务器获取数据时更新其窗口。因为它使用的是ClearSilver模板,所以每次从服务器收到更新时都需要加载glade文件。我试图通过每次更新时用新生成的子代替Windows第一个孩子来做到这一点。除了内存使用量持续增加这一事实之外,这种方法还可以,并且由于客户端需要连续运行,这最终将成为一个问题。
这就是我构建窗口的方式:
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "mywindow");
HDF* hdf = NULL;
CSPARSE *parse = NULL;
STRING newLayout;
string_init(&newLayout);
hdf_init(&hdf);
cs_init(&parse, hdf);
cs_parse_file(parse, gladeFilePath);
cs_render(parse, &newLayout, Render);
cs_destroy(&parse);
hdf_destroy(&hdf);
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
builder->add_from_string(newLayout.buf, newLayout.len);
gtk_builder_connect_signals_full(builder->gobj(), SignalConnect, NULL);
builder->get_widget("window", window);
string_clear(&newLayout);
app->run(*window);
cs_render调用的Render函数:
NEOERR* Render(void * ctx, char * data)
{
STRING * layout = (STRING *)ctx;
string_append(layout, data);
return 0;
}
这是我重建窗口的方式:
HDF* hdf = NULL;
CSPARSE *parse = NULL;
STRING newLayout;
Gtk::Widget* widget = NULL;
string_init(&newLayout);
hdf_init(&hdf);
cs_init(&parse, hdf);
cs_parse_file(parse, gladeFilePath);
cs_render(parse, &newLayout, Render);
cs_destroy(&parse);
hdf_destroy(&hdf);
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
builder->add_from_string(newLayout.buf, newLayout.len);
gtk_builder_connect_signals_full(builder->gobj(), SignalConnect, NULL);
builder->get_widget("child1", widget);
// remove the old child
window->remove();
widget->reparent(*window);
string_clear(&newLayout);
从另一个线程通过Glib :: Dispatcher
生成的新窗口答案 0 :(得分:0)
您不会破坏以前的小部件。 gtkmm-tutorial:
请注意,如果您从未将窗口小部件添加到任何父容器,或者 你做了,但后来Gtk :: Container :: remove()d从所说的父代gtkmm 将小部件的生命周期管理恢复到其具有的任何状态 在调用manage()之前,这通常意味着 删除小部件的责任返回给用户。
所以您需要这样的东西:
Gtk::Widget* oldWidget = window->get_child(); //from Gtk::Bin
if(oldWidget) //I had errors when reparenting into an empty Gtk::Container
{
widget->reparent(*window);
delete oldWidget;
}
else
window->add(*widget);