无法布置 wxWidgets 框架
Having trouble laying out wxWidgets frame
我正在尝试使用 wxWidgets 创建一些对话框。我正在为如何让它们以一种吸引人的标准方式进行布局而苦苦挣扎。在下面的示例中,我尝试创建框布局,其下方有一排确定和取消按钮。下图是我实际得到的。
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 向 TextControl 和 Button 添加左填充,10 in他们各自的添加命令,但没有做任何事情。
下一个问题是顶行的 3 个对象应该垂直对齐,但是像这样在所有 3 个组件上设置垂直对齐 box2->Add(newText, wxALIGN_CENTER);''' or
wxALIGN_CENTER_VERTICAL``` 只会改变它们之间的间距.
最严重的问题是确定和取消按钮根本没有出现。如果我删除 bSizer1->Add(stb)
命令,确定按钮会出现在最顶部,大概会覆盖取消按钮,但我不能确定。
我不知道去哪里寻求帮助。该文档没有包含太多示例,示例代码有点像狗的早餐。他们中的大多数都有相当随意的布局。
在我开始之前,有一个重要的建议:如果您在代码中创建布局(而不是从 XRC 加载它们),那么请务必使用 wxSizerFlags 使您的代码更具可读性(请参阅激励示例文档 link)。不幸的是,手动编写 sizer 代码仍然容易出错,因为编译器不能真正帮助你,但使用 wxSizerFlags
就变得不那么容易了。
要回答你的第一个问题,使用边框肯定应该而且确实有效,如果不看你做了什么,很难知道你到底出了什么问题,但是 Add(whatever, wxSizerFlags().Border(wxLEFT, 10))
确实在左边留下了 10px 的空白"whatever"。这样做的主要问题是您绝不能使用以像素为单位的硬编码值,所以请不要这样做,而是使用 DoubleBorder(wxLEFT)
之类的东西。
第二个问题是因为您没有垂直对齐 wxStaticText
,而且您似乎将对齐作为 Add()
的 proportion
参数传递——这解释了为什么它会修改您的布局(按钮现在展开)。 wxSizerFlags
你就不会犯这个错误了。
我不太确定按钮的问题,你的代码似乎是正确的,我最初的想法是你的框架太小而无法显示按钮,但这并不能解释为什么它们会出现在它的顶部。尽管如此,您应该在框架上调用 SetSizerAndFit()
而不仅仅是 SetSizer()
以确保最小框架大小足以显示其全部内容(顺便说一句,您不需要调用 Layout()
, 虽然没有坏处).
最后,手写sizer代码很烦人。特别是在开始时,首先在可视化对话框编辑器中执行此操作以确保您的布局在将其转录为 C++ 之前有效(并且一些对话框编辑器可以直接为您生成 C++ 代码)可能很有用。示例很适合查找某些东西的使用细节,但它们确实不会教你如何创建漂亮的布局,因为这并不是它们的真正目标,它们往往尽可能简单地展示它们的主题。而且它们中的大多数都已经很老了,所以甚至不要像它们真正应该使用的那样使用 wxSizerFlags
(绝对欢迎任何更改它们以使用它的补丁...)。
我正在尝试使用 wxWidgets 创建一些对话框。我正在为如何让它们以一种吸引人的标准方式进行布局而苦苦挣扎。在下面的示例中,我尝试创建框布局,其下方有一排确定和取消按钮。下图是我实际得到的。
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 向 TextControl 和 Button 添加左填充,10 in他们各自的添加命令,但没有做任何事情。
下一个问题是顶行的 3 个对象应该垂直对齐,但是像这样在所有 3 个组件上设置垂直对齐 box2->Add(newText, wxALIGN_CENTER);''' or
wxALIGN_CENTER_VERTICAL``` 只会改变它们之间的间距.
最严重的问题是确定和取消按钮根本没有出现。如果我删除 bSizer1->Add(stb)
命令,确定按钮会出现在最顶部,大概会覆盖取消按钮,但我不能确定。
我不知道去哪里寻求帮助。该文档没有包含太多示例,示例代码有点像狗的早餐。他们中的大多数都有相当随意的布局。
在我开始之前,有一个重要的建议:如果您在代码中创建布局(而不是从 XRC 加载它们),那么请务必使用 wxSizerFlags 使您的代码更具可读性(请参阅激励示例文档 link)。不幸的是,手动编写 sizer 代码仍然容易出错,因为编译器不能真正帮助你,但使用 wxSizerFlags
就变得不那么容易了。
要回答你的第一个问题,使用边框肯定应该而且确实有效,如果不看你做了什么,很难知道你到底出了什么问题,但是 Add(whatever, wxSizerFlags().Border(wxLEFT, 10))
确实在左边留下了 10px 的空白"whatever"。这样做的主要问题是您绝不能使用以像素为单位的硬编码值,所以请不要这样做,而是使用 DoubleBorder(wxLEFT)
之类的东西。
第二个问题是因为您没有垂直对齐 wxStaticText
,而且您似乎将对齐作为 Add()
的 proportion
参数传递——这解释了为什么它会修改您的布局(按钮现在展开)。 wxSizerFlags
你就不会犯这个错误了。
我不太确定按钮的问题,你的代码似乎是正确的,我最初的想法是你的框架太小而无法显示按钮,但这并不能解释为什么它们会出现在它的顶部。尽管如此,您应该在框架上调用 SetSizerAndFit()
而不仅仅是 SetSizer()
以确保最小框架大小足以显示其全部内容(顺便说一句,您不需要调用 Layout()
, 虽然没有坏处).
最后,手写sizer代码很烦人。特别是在开始时,首先在可视化对话框编辑器中执行此操作以确保您的布局在将其转录为 C++ 之前有效(并且一些对话框编辑器可以直接为您生成 C++ 代码)可能很有用。示例很适合查找某些东西的使用细节,但它们确实不会教你如何创建漂亮的布局,因为这并不是它们的真正目标,它们往往尽可能简单地展示它们的主题。而且它们中的大多数都已经很老了,所以甚至不要像它们真正应该使用的那样使用 wxSizerFlags
(绝对欢迎任何更改它们以使用它的补丁...)。