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

Spacer added to inner wxBoxSizer doesn't work in wxWidgets

本文关键字:wxWidgets 不起作用 内部 wxBoxSizer 添加      更新时间:2023-10-16

我有一个内部wxBoxSizer内部的间隔符问题。下面是示例代码:

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);

如果我移除外部尺寸垫片开始工作良好。是我的代码有bug吗?或者可能是wxWidgets的问题?

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

你的内部大小(sizer)不会在水平方向上扩展,因为你没有告诉它的父大小(mainS)在添加它时这样做,所以你的间距将始终是0像素宽,这是它的初始和最小宽度。

要解决这个问题,您只需要将mainS->Add(sizer, 0, wxALL, 5)行更改为使用wxALL | wxEXPAND

另外,我强烈建议您使用wxSizerFlags而不是上面所示的神秘语法。而且,最后也是最不重要的,但仍然值得一提的是,更喜欢使用更具可读性的AddStretchSpacer()而不是令人困惑的Add(0, 0, 1, wxEXPAND, 5)调用(它令人困惑,因为扩展分隔符不会做任何事情,并且在没有任何边界标志的情况下不会考虑边界大小)。