我還是習慣了wxWidgets中的sizers,並且似乎無法讓它們按照我想要的來做。瞭解wxWidgets sizer
我希望有一個大面板將包含其它面板/箱列表,其中每個隨後包含一系列的文本字段
----------------------
| label text box |
| label2 text box2 |
----------------------
----------------------
| label text box |
| label2 text box2 |
----------------------
----------------------
| label text box |
| label2 text box2 |
----------------------
我還需要能夠(在末尾)添加的,並刪除(任何地方)這些箱子。 如果包含面板太多,則需要使用垂直滾動條。
這是我到目前爲止所嘗試的,它適用於使用包含面板創建的第一個框,但其他附加項只是主面板左上角的一個小框,即使sizer代碼對於所有盒子都是一樣的。
//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×2的網格尺寸,但我不確定如何使文本框擴大到儘可能寬,同時使標籤保持儘可能小(但也保持2個文本之間的對齊盒)?