C++ 布局wxWidgets框架时遇到问题
我正在尝试使用wxWidgets创建一些对话框。我正在努力让他们以一种吸引人的标准方式进行布局。在下面的例子中,我试图创建一个框布局,下面有一行ok&cancel按钮。下面的图片是我实际得到的C++ 布局wxWidgets框架时遇到问题,c++,wxwidgets,C++,Wxwidgets,我正在尝试使用wxWidgets创建一些对话框。我正在努力让他们以一种吸引人的标准方式进行布局。在下面的例子中,我试图创建一个框布局,下面有一行ok&cancel按钮。下面的图片是我实际得到的 Form2::Form2() :wxFrame(nullptr, wxID_ANY, L"Simple form") { wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer(wxVERTICAL); wxStaticBox* box = n
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
命令,而根据文档,我本应该能够通过在各自的add命令中使用wxLEFT,10来为TextControl和Button添加左填充,但这没有任何作用
下一个问题是,顶行上的3个对象应该垂直对齐,但在所有3个组件上设置垂直对齐,例如box2->Add(newText,wxALIGN_CENTER);“”或者
wxALIGN\u CENTER\u VERTICAL``只会更改它们之间的间距
最严重的问题是“确定”和“取消”按钮根本不出现。如果我删除bSizer1->Add(stb)
命令,OK按钮会出现在最上面,可能会覆盖Cancel按钮,但我不能确定
我不知道去哪里寻求帮助。文档中没有太多示例,示例代码有点像狗的早餐。在我开始之前,有一个重要的建议:如果你用代码创建布局(而不是从XRC加载布局),那么一定要使用它使代码更具可读性(参见文档链接中的激励示例)。不幸的是,手工编写sizer代码仍然很容易出错,因为编译器实际上帮不了你多少忙,但是使用
wxSizerFlags
就不那么容易了
要回答您的第一个问题,使用borders肯定应该而且确实有效,如果没有看到您所做的,很难知道您到底出了什么问题,但是Add(whatever,wxSizerFlags().Border(wxLEFT,10))
确实在“whatever”的左侧留下了10px的间隙。这方面的主要问题是,绝对不能使用硬编码的像素值,因此请不要这样做,而是使用类似于DoubleBorder(wxLEFT)
的方法
第二个问题是由于您没有垂直对齐wxStaticText
,还因为您似乎将对齐作为Add()
的比例
参数传递,这解释了为什么它会改为修改布局(按钮现在展开)。使用wxSizerFlags
您就不会犯这个错误
我不太确定按钮的问题,你的代码似乎是正确的,我最初的想法是你的框架太小,无法显示按钮,但这并不能解释为什么它们会出现在它的顶部。不过,您应该在框架上调用setSizerAndIt()
,而不是只调用SetSizer()
,以确保最小框架大小足够大,可以显示其全部内容(顺便说一句,您不需要调用Layout()
,尽管这样做没有坏处)
最后,手工编写sizer代码很烦人。特别是在启动时,首先在可视化对话框编辑器中做它是有用的,以确保在将其转录成C++之前,布局是有效的(并且一些对话框编辑器可以直接生成C++代码)。示例很好地查找了某些东西的使用细节,但它们确实不会教您如何创建好的布局,因为这不是它们真正的目标,它们倾向于尽可能简单地演示它们的主题。他们中的大多数人都很老了,所以他们甚至不应该使用
wxSizerFlags
(任何补丁改变他们使用它都是非常受欢迎的…。这里有很多好的信息SetSizerAndIt
和缺少的比例设置是关键。我现在在摆弄浆纱布。。。这绝对是一个更好的语法。你能推荐一个对话框编辑器吗?有几个对话框编辑器,我真的不想在这里玩最喜欢的,所以请从中选择一个(或者全部尝试…)。