wxWidgets Sizer不会自动布局

时间:2012-07-10 13:18:52

标签: wxwidgets

这是我的代码:

cLicensePanel::cLicensePanel( wxWindow * parent )
        : wxPanel(parent,-1,wxPoint(0,0),wxSize(500,500))
    {
        wxBoxSizer * szrUserKey = new wxBoxSizer(wxHORIZONTAL);
        myUserKeyCtrl = new wxTextCtrl(this,-1,L"");
        szrUserKey->Add( new wxStaticText(this,-1,wxString(L"User's ComputerKey:")),
                   0,wxALL,10);
        szrUserKey->Add( myUserKeyCtrl,0,wxALL,10);
        szrUserKey->Add( new wxButton(this,IDC_Generate,L"Generate"),0,wxALL,10);
        SetSizer( szrUserKey );
    }

这是为了生成这个显示,3个小部件整齐排列成一排。

enter image description here

然而,我实际得到的是所有小部件都堆叠在另一个

之上

enter image description here

为什么?

我可以通过添加对Sizer :: Layout()

的显式调用来强制显示正确的显示
cLicensePanel::cLicensePanel( wxWindow * parent )
        : wxPanel(parent,-1,wxPoint(0,0),wxSize(500,500))
    {
        wxBoxSizer * szrUserKey = new wxBoxSizer(wxHORIZONTAL);
        myUserKeyCtrl = new wxTextCtrl(this,-1,L"");
        szrUserKey->Add( new wxStaticText(this,-1,wxString(L"User's Computer Key:")),0,wxALL,10);
        szrUserKey->Add( myUserKeyCtrl,0,wxALL,10);
        szrUserKey->Add( new wxButton(this,IDC_Generate,L"Generate"),0,wxALL,10);
        szrUserKey->Layout();
        SetSizer( szrUserKey );
    }

我可以忍受这个,虽然在我看来,没有必要调用布局。我还怀疑布局调用是否必要的原因可能是我难以理解的问题的重要线索。

以上是使用wxWidgets v2.8.12时的行为。我正在升级到v2.9.3。

在新版本中,没有调用Layout()的初始代码显示了相互堆叠的小部件相同的问题。如果我在v2.9.3中添加对layout()的调用,那么我根本看不到任何小部件 - 面板显示完全空白!

1 个答案:

答案 0 :(得分:4)

SetSizer()故意不进行布局,只有在调整窗口大小时才会发生。但是,新设置的窗口在显示后很快就会得到一个EVT_SIZE,所以当用户看到它时,它已经布局了(这就是SetSizer()没有的原因}这样做:这将是浪费,因为无论如何在99%的情况下很快就会重做。)

在您的情况下,面板无论出于何种原因都不会获得此尺寸事件。也许 - 看看你的其余代码 - 你可以看到它是什么并避免它。但如果没有,调用Layout()也是一个很好的解决方案。除非您应该在面板本身上调用相同的方法,而不是在sizer上调用,即执行

cLicensePanel::cLicensePanel( wxWindow * parent )
{
    ...
    SetSizer(szrUserKey);
    Layout();
}