我仍然习惯于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文本之间的对齐)框)?
答案 0 :(得分:1)
“如果太多而无法容纳在容纳面板中,则还需要垂直滚动条。”
你可以查看wxScrolledWindow。
“其他添加的项目只是主面板左上方的一个小框”
我不确定,但是,调用wxSizer :: Layout()可能会有所帮助。
“还有最好的方法来列出每个盒子的内容吗?”
看看this sizerdemo。如果不是必须的,标签保持尽可能小,您可以给标签一个固定的宽度,只让文本框增长。如果要在添加或删除新框时调整大小,可以实现OnSize()事件处理程序。
答案 1 :(得分:0)
我建议您将此问题发布到wxWidgets mailing list之一吗?他们将能够很快帮助你。
答案 2 :(得分:0)
我是否也可以推荐wxForum,我发现它过去对wxWidgets问题非常有用。
更具体地说,滚动wxScrolledWindow应该有帮助,使用wxScrolledWindow-&gt; SetSizer和你的顶级sizer(包含你的控件的那个)来设置滚动区域,同时查看名为scroll,scrollsub的示例和vscroll包含在wxWidgets中(在wxwidgets安装的samples目录中)。