2012-04-26 8 views
0

私はGtk +で少し練習しています。私は、作業メニュー付きのウィンドウを作成するためにabelしてきました。 テストオブジェクト(基本的に正方形で、辺の長さを入力するように求める)を作成してベクトルに格納できますが、リストすることはできません。私が欲しいものベクトルの内容を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(); 

[EDIT:]

1)VCはスタンダードである::ベクター。これはクラス属性です。

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

'vc'を定義して移植するコードを提供する必要があります。それが空の場合はどうなりますか? – Irfy

+0

そのコードで投稿を更新します! –

+0

'for'ループでは、" Square number# "というテキストを含むラベルを追加するだけです。あなたはそのテキストを見ますか? 'Cuadrado'オブジェクトから情報を追加するために、ループ内にコードを追加するだけでよいでしょうか?実際にそのようなオブジェクトのコンテンツにアクセスできますか? – Irfy

答えて

0

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

私は実際にGtkを知らないので、これは暗闇の中で少し撮影しています。元のものが破壊されるようにウィジェットがコピーされているかどうかわかりませんが、私は純粋にC + +の観点から上に記述しました。

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

+0

こんにちは!私は問題を解決しました。あなたが提案して_table_にそれらを格納するときに、ヒープ内のラベルを宣言しました。 ありがとうIrfy! –

関連する問題