【问题标题】:Having trouble laying out wxWidgets frame布局 wxWidgets 框架时遇到问题
【发布时间】:2016-10-16 02:52:08
【问题描述】:

我正在尝试使用 wxWidgets 创建一些对话框。我正在努力让它们以一种吸引人的标准方式进行布局。在下面的示例中,我正在尝试创建带有一行 ok & cancel 按钮的框布局。下图是我实际得到的。

Form2::Form2() :wxFrame(nullptr, wxID_ANY, L"Simple form")
{
    wxBoxSizer* bSizer1;
    bSizer1 = new wxBoxSizer(wxVERTICAL);

    wxStaticBox* box = new wxStaticBox(this, wxID_ANY, "BOX");
    wxStaticBoxSizer *sz = new wxStaticBoxSizer(box, wxVERTICAL);
    wxBoxSizer* box2 = new wxBoxSizer(wxHORIZONTAL);
    box2->Add(new wxStaticText(box, wxID_ANY, "static text"));
    box2->AddSpacer(10);
    newText = new wxTextCtrl(box, wxID_ANY, "add me");
    box2->Add(newText);
    box2->AddSpacer(10);
    wxButton* btnAdd = new wxButton(box, wxID_ANY, "Add");
    box2->Add(btnAdd);
    sz->Add(box2,0, wxALL, 5);
    lstFile = new wxListBox(box, wxID_ANY, wxDefaultPosition, wxSize(400,500), 0, NULL, wxLB_SINGLE | wxLB_NEEDED_SB);
    sz->Add(lstFile, 0, wxALL, 5);
    bSizer1->Add(sz);

    wxStdDialogButtonSizer* stb = new wxStdDialogButtonSizer( );
    stb->AddButton(new wxButton(this, wxID_OK));
    stb->AddButton(new wxButton(this, wxID_CANCEL));
    stb->Realize();
    bSizer1->Add(stb);

    this->SetSizer(bSizer1);
    this->Layout();
    this->Centre(wxBOTH);           
}

首先,我不明白为什么我需要box2->AddSpacer 命令,根据文档,我应该能够通过在各自的添加命令中使用 wxLEFT 和 10 向 TextControl 和 Button 添加左填充,但这并没有做任何事情。

下一个问题是顶行的 3 个对象应该垂直对齐,但是像 box2->Add(newText, wxALIGN_CENTER);''' orwxALIGN_CENTER_VERTICAL`` 对所有 3 个组件设置垂直对齐只会改变它们之间的间距。

最严重的问题是确定和取消按钮根本不出现。如果我删除bSizer1->Add(stb) 命令,确定按钮会出现在最顶部,大概覆盖了取消按钮,但我不能确定。

我不知道去哪里寻求帮助。文档没有包含太多示例,示例代码有点像狗的早餐。他们中的大多数都有相当随意的布局。

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    在我开始之前,一个重要的建议是:如果您在代码中创建布局(而不是从 XRC 加载它们),那么请使用 wxSizerFlags 使您的代码更具可读性(请参阅文档链接中的激励示例) .不幸的是,手动编写 sizer 代码仍然容易出错,因为编译器并不能真正帮助您,但使用 wxSizerFlags 就变得不那么重要了。

    要回答您的第一个问题,使用边框绝对应该并且确实有效,如果不查看您所做的事情,很难知道您到底出了什么问题,但是Add(whatever, wxSizerFlags().Border(wxLEFT, 10)) 确实在“随便”的左侧留下了 10 像素的间隙。这样做的主要问题是您绝对不能使用以像素为单位的硬编码值,因此请不要这样做,而是使用 DoubleBorder(wxLEFT) 之类的东西。

    第二个问题是由于您没有垂直对齐wxStaticText,而且您似乎将对齐作为Add()proportion 参数传递——这解释了为什么它会修改您的布局而不是(按钮现在展开)。使用wxSizerFlags,您就不会犯这个错误。

    我不太确定按钮的问题,您的代码似乎正确,我最初的想法是您的框架太小而无法显示按钮,但这并不能解释为什么它们会出现在顶部其中。尽管如此,您应该在框架上调用 SetSizerAndFit() 而不仅仅是 SetSizer() 以确保最小框架大小足够大以显示其全部内容(顺便说一句,您不需要调用 Layout(),尽管它没有伤害)。


    最后,手工编写sizer 代码很烦人。特别是在开始时,首先在可视对话框编辑器中执行此操作以确保您的布局在将其转录为 C++ 之前可以正常工作(并且某些对话框编辑器可以直接为您生成 C++ 代码),这可能很有用。示例可以很好地查看某些东西的使用细节,但它们确实不会教你如何创建漂亮的布局,因为这不是他们的真正目标,它们往往会尽可能简单地展示他们的主题。而且它们中的大多数都已经很老了,因此甚至不应该使用wxSizerFlags,因为它们确实应该使用(绝对欢迎任何补丁更改它们以使用它...)。

    【讨论】:

    • 这里有很多很好的信息。 SetSizerAndFit 和缺少的比例设置是关键。我现在正在摆弄 SizerFlags……这绝对是一个更好的语法。你能推荐一个对话框编辑器吗?
    • 对话框编辑器有好几个,我实在不想在这里玩收藏,所以请从wiki page中选择一个(或者全部尝试...)。
    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2011-04-14
    • 2016-07-28
    • 2017-08-10
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多