添加到内部 wxBoxSizer 的 Spacer 在 wxWidgets 中不起作用
Spacer added to inner wxBoxSizer doesn't work in wxWidgets
我对内部 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);
如果我移除外部尺寸器垫片,它就会开始正常工作。它是我的代码中的错误吗?或者 wxWidgets 有问题?
我找不到答案,有人可以帮忙吗? wxWidgets 3.0.2
你的 inner sizer (sizer
) 不会在水平方向扩展,因为你在添加它时没有告诉它的父 sizer (mainS
) 这样做,所以你的 spacer 会始终为 0 像素宽,这是其初始宽度和最小宽度。
要解决此问题,您只需将 mainS->Add(sizer, 0, wxALL, 5)
行更改为使用 wxALL | wxEXPAND
。
此外,我强烈 鼓励您考虑使用 wxSizerFlags
而不是上面显示的神秘语法。而且,最后也是最不重要的,但仍然值得一提的是,更喜欢使用更具可读性的 AddStretchSpacer()
而不是令人困惑的 Add(0, 0, 1, wxEXPAND, 5)
调用(这很令人困惑,因为扩展你的间隔符没有做任何事情并且没有考虑边框大小帐户没有任何边界标志)。
我对内部 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);
如果我移除外部尺寸器垫片,它就会开始正常工作。它是我的代码中的错误吗?或者 wxWidgets 有问题?
我找不到答案,有人可以帮忙吗? wxWidgets 3.0.2
你的 inner sizer (sizer
) 不会在水平方向扩展,因为你在添加它时没有告诉它的父 sizer (mainS
) 这样做,所以你的 spacer 会始终为 0 像素宽,这是其初始宽度和最小宽度。
要解决此问题,您只需将 mainS->Add(sizer, 0, wxALL, 5)
行更改为使用 wxALL | wxEXPAND
。
此外,我强烈 鼓励您考虑使用 wxSizerFlags
而不是上面显示的神秘语法。而且,最后也是最不重要的,但仍然值得一提的是,更喜欢使用更具可读性的 AddStretchSpacer()
而不是令人困惑的 Add(0, 0, 1, wxEXPAND, 5)
调用(这很令人困惑,因为扩展你的间隔符没有做任何事情并且没有考虑边框大小帐户没有任何边界标志)。