添加到内部wxBoxSizer的Spacer在wxWidgets中不起作用

时间:2016-11-14 08:47:59

标签: c++ wxwidgets

我在内部wxBoxSizer内部存在spacer问题。 这是示例代码。

class Frame : public wxFrame
{
public:
    Frame()
        : wxFrame(nullptr,
                  wxID_ANY,
                  wxEmptyString,
                  wxDefaultPosition,
                  wxSize(600, 200))
    {
        wxPanel* panel = new wxPanel(this);

        // Some OUTER SIZER
        wxBoxSizer* mainS = new wxBoxSizer(wxVERTICAL);

        // INNER HORIZONTAL SIZER
        wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);

        wxStaticText* text = new wxStaticText(panel, wxID_ANY, wxT("Some Text"));        
        sizer->Add(text, 0, wxALL, 5);

        wxComboBox* comboBox = new wxComboBox(panel, wxID_ANY, wxT("Combo"));
        sizer->Add(comboBox, 0, wxALL, 5);

        // SPACER
        sizer->Add(0, 0, 1, wxEXPAND, 5);

        wxButton* button = new wxButton(panel, wxID_ANY, wxT("Some button"));
        sizer->Add(button, 0, wxALL, 5);
        mainS->Add(sizer, 0, wxALL, 5); 

        panel->SetSizer(mainS);

        // PANEL SIZER
        wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
        panelSizer->Add(panel, 1, wxEXPAND, 5);

        SetSizer(panelSizer);
        Layout();
        Centre(wxBOTH);
    }
};

class WxguiApp
    : public wxApp
{
public:
    bool OnInit() override
    {
        Frame* w = new Frame();
        w->Show();
        SetTopWindow(w);

        return true;
    }
};

IMPLEMENT_APP(WxguiApp);

如果我移除外部sizer spacer,开始正常工作。这是我的代码中的错误吗?或者可能是wxWidgets的一些问题?

我找不到答案,也许有人帮忙? wxWidgets 3.0.2

1 个答案:

答案 0 :(得分:1)

您的内部分类器(sizer)不会在水平方向上扩展,因为您在添加它时没有告诉其父分级器(mainS)执行此操作,因此您的spacer始终为0像素宽,这是它的初始宽度和最小宽度。

要解决此问题,您只需更改mainS->Add(sizer, 0, wxALL, 5)行即可使用wxALL | wxEXPAND

此外,我强烈鼓励您使用wxSizerFlags而不是上面显示的神秘语法。并且,最后也是最不重要的,但仍然值得一提的是,更喜欢使用更具可读性的AddStretchSpacer()来解决令人困惑的Add(0, 0, 1, wxEXPAND, 5)电话(这令人困惑,因为扩展您的间隔器并没有做任何事情和没有任何边框标记时不考虑边框大小。)