私はまだ wxWidgets のサイザーに慣れていません。
他のパネル/ボックスのリストを含む大きなパネルが必要で、それぞれに一連のテキスト フィールドが含まれます
----------------------
| label text box |
| label2 text box2 |
----------------------
----------------------
| label text box |
| label2 text box2 |
----------------------
----------------------
| label text box |
| label2 text box2 |
----------------------
また、これらのボックスを (最後に) 追加したり、(どこでも) 削除したりできる必要があります。含まれているパネルに収まらないほど多くある場合は、垂直スクロール バーも必要です。
これは私がこれまでに試したことであり、含まれているパネルで作成された最初のボックスで機能しますが、追加の追加アイテムはメインパネルの左上にある小さなボックスにすぎません。サイザーコードは同じですすべてのボックス。
//itemsList is a container containg a list of *Item pointers to each box/panel/whatever the right name is
Items::Items(wxWindow *parent)
:wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SUNKEN)
{
//one sstarting item
OnAdd(wxCommandEvent());
}
void Items::OnAdd(wxCommandEvent &event)
{
unsigned id = itemsList .size();
Item *item = new Item(this,id);
itemsList .push_back(item);
RebuildSizer();
}
void Items::RebuildSizer()
{
this->SetSizer(0,true);
wxBoxSizer *sizerV = new wxBoxSizer(wxVERTICAL);
for(std::vector<Item*>::iterator it = itemsList .begin(); it != itemsList .end(); ++it)
sizerV->Add(*it, 1, wxEXPAND | wxLEFT | wxRIGHT, 5);
SetSizer(sizerV);
}
void Items::OnRemove (wxCommandEvent &event, unsigned itemId)
{
delete itemsList [itemId];
itemsList .erase(items.begin()+itemId);
for(std::vector<Item*>::iterator it = itemsList .begin()+itemId; it != itemsList .end(); ++it)
(*it)->ChangeId(itemId++);
RebuildSizer();
}
また、各ボックスの内容をレイアウトする最良の方法は何ですか? 2 x 2 のグリッドサイザーを使用することを考えていましたが、ラベルをできるだけ小さくしながら、テキスト ボックスをできるだけ広くする方法がわかりません (ただし、2 つのテキスト間の配置も維持します)。ボックス)?