无法向 Gtk::ListBox 添加新行

Can't add new rows to a Gtk::ListBox

我想动态添加新的 Gtk::ListBoxRow(s)Gtk::ListBox,但它们不显示起来。在测试期间我注意到,即使是一个简单的函数也无法添加新的 Gtk::ListBoxRow.

#include <gtkmm.h>
#include <iostream>
using namespace std;

Gtk::ListBox* listbox;

void test() {
    Gtk::Label other("other");
    Gtk::Box otherbox;
    otherbox.pack_start(other);
    Gtk::ListBoxRow otherrow;
    otherrow.add(otherbox);
    listbox->append(otherrow);
    // this doesn't help either
    listbox->show_all_children();
}


int main(int argc, char* argv[]) {
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "im.lost");

    Gtk::ApplicationWindow window;
    window.set_title("I'm lost");
    window.set_position(Gtk::WIN_POS_CENTER);
    window.set_default_size(600, 400);
    window.set_border_width(10);

    listbox = new Gtk::ListBox();
    listbox->set_selection_mode(Gtk::SELECTION_NONE);

    Gtk::Label foo("foo");
    Gtk::Label fooo("fooo");
    Gtk::Box foobox;
    foobox.pack_start(foo);
    foobox.pack_start(fooo);
    Gtk::ListBoxRow foorow;
    foorow.add(foobox);
    listbox->append(foorow);

    Gtk::Label bar("bar");
    Gtk::Label barr("barr");
    Gtk::Box barbox;
    barbox.pack_start(bar);
    barbox.pack_start(barr);
    Gtk::ListBoxRow barrow;
    barrow.add(barbox);
    listbox->append(barrow);


    Gtk::Label baz("baz");
    Gtk::Label bazz("bazz");
    Gtk::Box bazbox;
    bazbox.pack_start(baz);
    bazbox.pack_start(bazz);
    Gtk::ListBoxRow bazrow;
    bazrow.add(bazbox);
    listbox->append(bazrow);

    test();

    window.add(*listbox);
    window.show_all_children();
    return app->run(window);

}

此代码可以编译并 运行 使用:

g++ -o listbox listbox.cpp `pkg-config gtkmm-3.0 --cflags --libs` && ./listbox

我做错了什么?

谢谢

在您的函数 test() 中,您创建的小部件在函数退出时超出范围时将被销毁。因此它们无法显示。您需要做的是使用 new 创建小部件,并让它们由父小部件管理。 gtkmm 书描述了更多关于小部件管理的内容。 https://developer.gnome.org/gtkmm-tutorial/stable/sec-memory-widgets.html.en

这是您函数的更正版本 test()

void test() {
    Gtk::Label *other = Gtk::manage(new Gtk::Label("other"));
    Gtk::Box *otherbox = Gtk::manage(new Gtk::Box());
    otherbox->pack_start(*other);
    Gtk::ListBoxRow *otherrow = Gtk::manage(new Gtk::ListBoxRow());
    otherrow->add(*otherbox);
    listbox->append(*otherrow);
}