gpt4 book ai didi

c++ - 理解 wxWidgets sizer

转载 作者:行者123 更新时间:2023-11-28 08:34:20 26 4
gpt4 key购买 nike

我还在习惯 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 个文本之间的对齐方式箱)?

最佳答案

“如果内容太多无法容纳在包含面板中,则还需要一个垂直滚动条。”

你可以看看 wxScrolledWindow。

“额外添加的项目只是主面板左上角的一个小框”

我不确定,但是,也许调用 wxSizer::Layout() 会有所帮助。

“另外,布置每个盒子的内容的最佳方式是什么?”

看看this sizerdemo .如果不是强制性的,标签尽可能小,你可以给标签一个固定的宽度,只让文本框增长。如果您想在添加或删除新框时调整大小,您可以实现 OnSize() 事件处理程序。

关于c++ - 理解 wxWidgets sizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com