无法向 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);
}
我想动态添加新的 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);
}