【问题标题】:Understanding wxWidgets sizers了解 wxWidgets 尺寸器
【发布时间】:2008-11-06 16:43:09
【问题描述】:

我仍然习惯于 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 个文本之间的对齐盒子)?

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

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

    你可以看看 wxScrolledWindow。

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

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

    “还有什么最好的方式来布置每个盒子的内容?”

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

    【讨论】:

      【解决方案2】:

      我可以建议您将此问题发布到wxWidgets mailing list 之一吗?他们将能够非常迅速地为您提供帮助。

      【讨论】:

        【解决方案3】:

        我也可以推荐wxForum,我发现它对过去的wxWidgets问题非常有用。

        更具体地用于滚动wxScrolledWindow 应该会有所帮助,使用 wxScrolledWindow->SetSizer 与您的顶级大小调整器(包含您的控件的那个)来设置滚动区域,还可以查看名为 scroll、scrollsub 和 vscroll 的示例在 wxWidgets 中(在 wxwidgets 安装的示例目录中)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-10
          • 2011-01-24
          • 2013-06-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多