gpt4 book ai didi

c++ - 无法将新行添加到 Gtk::ListBox

转载 作者:行者123 更新时间:2023-11-28 05:15:05 25 4
gpt4 key购买 nike

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

我做错了什么?

谢谢

最佳答案

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

关于c++ - 无法将新行添加到 Gtk::ListBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42841472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com