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

documentationによると、addメンバー関数は参照によってウィジェットを受け入れます。つまり、ここで渡すオブジェクトは、それらを参照するコンテナーの存続期間全体にわたって存在する必要があります。forループでは、ループが 1 回繰り返されるとすぐに存在しなくなります。ループの前にラベルを作成すると、関数の最後で存在しなくなります。これと同等のものに遭遇します: Returning a reference to a local or temporary variable

さて、これは暗闇の中で少し撮影しています。なぜなら、私はGtkをよく知らないし、ウィジェットが別の場所にコピーされているかどうかもわからないため、元のものが破壊される可能性がありますが、上で説明したように見えます純粋に C++ の観点から。

これが原因であることを確認するには、すべてのラベルをアプリケーションに対してグローバルに定義し、それらが表示されるかどうかを確認してください。labelもしそうなら、その関数/ループが終わった後(そしてまだ適切に破棄することができる)、それらが生きている方法で(例えばヒープ上で) sを宣言する必要があることがわかります。

于 2012-04-27T23:40:18.257 に答える