gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:57:47 30 4
gpt4 key购买 nike

我对内部 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);

如果我移除外部 sizer spacer 开始正常工作。它是我的代码中的错误吗?还是 wxWidgets 有问题?

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

最佳答案

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

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

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

关于c++ - 添加到内部 wxBoxSizer 的 Spacer 在 wxWidgets 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40584813/

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