我正在练习Gtk +。我一直在创建一个带有工作菜单的窗口。 我可以创建测试对象(基本上是一个正方形,要求用户输入边长)并将它们存储在矢量中,但我无法列出它们。
我想要的是显示一个滚动的窗口,列出所有存储的对象,如:
_Square 1-side:7_
_Square 2-side:25_
到目前为止,我可以显示带有文本标签的滚动窗口,但没有关于存储对象的信息。 这是我尝试过的代码:
Gtk::Dialog dialog("Listing Squares",false,true);
dialog.set_default_size(500,30);
Gtk::Button close("Close");
close.signal_clicked().connect( sigc::mem_fun(*this,&Window::onFileListButtonClose) );
Gtk::VBox* vbox = dialog.get_vbox();
Gtk::ScrolledWindow sw;
sw.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
/** FETCH FROM ARRAY*/
for(unsigned int i(0); i<vc.size();++i){
Gtk::Label label( "Square number " + i );
sw.add( label );
}
sw.show_all_children();
vbox->pack_start( sw );
vbox = 0;
dialog.add_action_widget(close,1);
dialog.show_all_children();
dialog.run();
[编辑:]
1) vc 是std :: vector。它是一个类属性。
2)要求用户输入正方形长度并将其存储在vc中的代码。
void Window::onMenuFileNew(void) {
Gtk::Dialog dialog("New Square",true,true);
dialog.set_default_size(70,20);
dialog.set_has_separator(true);
Gtk::Button close("Close");
entry.set_max_length(2);
entry.set_text("");
close.signal_clicked().connect( sigc::mem_fun(*this,&Window::onFileNewButtonClose) );
Gtk::Label lab("Square side length:");
Gtk::VBox* vbox = dialog.get_vbox();
vbox->pack_start( lab );
vbox->pack_start( entry );
vbox = 0;
dialog.add_action_widget(close,1);
dialog.show_all_children();
dialog.run();
}
void Window::onFileNewButtonClose(void) {
int side = atoi( (entry.get_text()).c_str() );
vc.push_back(Cuadrado( side ));
}
任何帮助将不胜感激。 :)
PS:在尝试列出方块之前,我创建了一些方块!
答案 0 :(得分:0)
根据documentation,add
成员函数通过引用接受小部件。这意味着您在此处传递的对象必须在引用它们的容器的整个生命周期中存在。在for
循环中,一旦循环进行一次迭代,它们就不再存在,如果在循环之前创建标签,它们将不再存在于函数的末尾。你碰到了相当于:Returning a reference to a local or temporary variable。
现在,这是在黑暗中拍摄的一点点,因为我真的不知道Gtk,我不知道小部件是否被复制到其他地方,所以原件可能会被破坏,但它看起来像我的方式从纯粹的C ++角度来描述它。
为了确保这是罪魁祸首,请在应用程序中全局定义所有标签,看看它们是否出现。如果他们这样做,你就会知道你需要在该函数/循环结束之后以一种它们存活的方式声明label
(例如在堆上)(并且仍然可以被适当地销毁)。