我想动态地将新的 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
我做错了什么?
谢谢
答案 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);
}