无法向Gtk :: ListBox添加新行

时间:2017-03-16 17:53:47

标签: c++ gtkmm

我想动态地将新的 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

enter image description here

我做错了什么?

谢谢

1 个答案:

答案 0 :(得分:1)

在函数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);
}