0

我正在用 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:在尝试列出正方形之前,我创建了一些正方形!

4

1 回答 1

0

根据文档add成员函数通过引用接受小部件。这意味着您在此处传递的对象必须存在于引用它们的容器的整个生命周期中。在for循环中,一旦循环进行一次迭代,它们就不再存在,如果您在循环之前创建标签,它们在函数结束时不再存在。您会遇到类似的情况:返回对本地或临时变量的引用

现在,这有点在黑暗中拍摄,因为我并不真正了解 Gtk,也不知道小部件是否被复制到其他地方,因此原始可能会被破坏,但它看起来像我上面描述的方式从纯 C++ 的角度来看。

只是为了确保这是罪魁祸首,将所有标签全局定义到您的应用程序并查看它们是否出现。如果他们这样做了,您就会知道您需要label在该函数/循环结束后(并且仍然可以适当地销毁)以使它们处于活动状态(例如在堆上)的方式声明 s。

于 2012-04-27T23:40:18.257 回答