我仍然习惯于 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 x 2 网格大小调整器,但我不确定如何使文本框尽可能扩大,同时使标签尽可能小(但也要保持 2 个文本之间的对齐盒子)?