笔记本旁边的大小调整器和控件
sizers and controls next to notebooks
我在笔记本旁边实现控件时遇到布局问题。
问题是,笔记本和它旁边的控件按预期正确对齐,但笔记本中 window 上的控件彼此重叠,就好像没有 sizer使用过。
我很感激任何关于如何解决这个问题的意见。
编辑:提供示例代码来演示问题
Header test.h:
class mainwindow : public wxFrame{
public:
mainwindow(const wxString &title);
wxWindow *notebookwindow[2];
wxTextCtrl *onnotebook[2];
wxNotebook *notebook;
wxTextCtrl *onmain[2];
wxBoxSizer *box[4];
};
class myapp : public wxApp {
public:
virtual bool OnInit();
};
test.cpp
// program test
#include <iostream>
#include <stdlib.h>
#include <string>
#include <map>
#include <typeinfo>
#include <fstream>
#include <vector>
#include <wx/wx.h>
#include <wx/textctrl.h>
#include <wx/notebook.h>
#include <wx/stattext.h>
#include <wx/sizer.h>
#include "test.h"
mainwindow :: mainwindow (const wxString & title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(1000, 800)){
notebook = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxSize(200, 200));
notebookwindow[0] = new wxWindow(notebook, wxID_ANY);
notebookwindow[1] = new wxWindow(notebook, wxID_ANY);
notebook->AddPage(notebookwindow[0], wxT("This"));
notebook->AddPage(notebookwindow[1], wxT("That"));
onmain[0] = new wxTextCtrl(this, wxID_ANY, wxT("on main 1"));
onmain[1] = new wxTextCtrl(this, wxID_ANY, wxT("on main 2"));
onnotebook[0] = new wxTextCtrl(notebookwindow[0], wxID_ANY, wxT("on notebook 1"));
onnotebook[1] = new wxTextCtrl(notebookwindow[0], wxID_ANY, wxT("on notebook 2"));
box[0] = new wxBoxSizer(wxVERTICAL);
box[1] = new wxBoxSizer(wxVERTICAL);
box[2] = new wxBoxSizer(wxHORIZONTAL);
box[0]->Add(onmain[0]);
box[0]->Add(onmain[1]);
box[1]->Add(onnotebook[0]);
box[1]->Add(onnotebook[1]);
box[2]->Add(box[0]);
box[2]->Add(notebook);
notebookwindow[0]->SetSizer(box[1]);
this->SetSizer(box[2]);
}
bool myapp::OnInit(){
mainwindow *mainfr = new mainwindow( wxT("test"));
mainfr->Show(true);
return true;
}
IMPLEMENT_APP(myapp);
和生成文件
main=test.o
flags=-std=c++11 -g
folders=tables sources
gui=`wx-config --cxxflags --libs`
all: $(addprefix doto/,$(main))
$(CXX) $(flags) $^ $(gui) -o test.exe
doto/%.o:%.cpp %.h
$(CXX) $(flags) $< $(gui) -c -o doto/$(notdir $(<:.cpp=.o))
.PHONY:clean
clean:
rm doto/*.o *.exe
看起来 wxNotebook
喜欢它的页面在添加时完全组装。所以,移动
notebook->AddPage(notebookwindow[0], wxT("This"));
notebook->AddPage(notebookwindow[1], wxT("That"));
就在
之前
this->SetSizer(box[2]);
解决了问题。
另一个修复是在完全设置后在笔记本页面本身上强制布局,也就是说,在不更改原始代码中的任何其他内容的情况下,添加
notebookwindow[0]->Layout();
就在
之前
this->SetSizer(box[2]);
我不确定是否应将此行为视为错误。我希望在顶级父级上调用 Layout()
以传播到任何地方并避免此类问题,但在这种情况下它看起来不像那样工作。
我现在没有时间进一步调查;如果能得到VZ.的意见就好了
我在笔记本旁边实现控件时遇到布局问题。
问题是,笔记本和它旁边的控件按预期正确对齐,但笔记本中 window 上的控件彼此重叠,就好像没有 sizer使用过。
我很感激任何关于如何解决这个问题的意见。
编辑:提供示例代码来演示问题
Header test.h:
class mainwindow : public wxFrame{
public:
mainwindow(const wxString &title);
wxWindow *notebookwindow[2];
wxTextCtrl *onnotebook[2];
wxNotebook *notebook;
wxTextCtrl *onmain[2];
wxBoxSizer *box[4];
};
class myapp : public wxApp {
public:
virtual bool OnInit();
};
test.cpp
// program test
#include <iostream>
#include <stdlib.h>
#include <string>
#include <map>
#include <typeinfo>
#include <fstream>
#include <vector>
#include <wx/wx.h>
#include <wx/textctrl.h>
#include <wx/notebook.h>
#include <wx/stattext.h>
#include <wx/sizer.h>
#include "test.h"
mainwindow :: mainwindow (const wxString & title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(1000, 800)){
notebook = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxSize(200, 200));
notebookwindow[0] = new wxWindow(notebook, wxID_ANY);
notebookwindow[1] = new wxWindow(notebook, wxID_ANY);
notebook->AddPage(notebookwindow[0], wxT("This"));
notebook->AddPage(notebookwindow[1], wxT("That"));
onmain[0] = new wxTextCtrl(this, wxID_ANY, wxT("on main 1"));
onmain[1] = new wxTextCtrl(this, wxID_ANY, wxT("on main 2"));
onnotebook[0] = new wxTextCtrl(notebookwindow[0], wxID_ANY, wxT("on notebook 1"));
onnotebook[1] = new wxTextCtrl(notebookwindow[0], wxID_ANY, wxT("on notebook 2"));
box[0] = new wxBoxSizer(wxVERTICAL);
box[1] = new wxBoxSizer(wxVERTICAL);
box[2] = new wxBoxSizer(wxHORIZONTAL);
box[0]->Add(onmain[0]);
box[0]->Add(onmain[1]);
box[1]->Add(onnotebook[0]);
box[1]->Add(onnotebook[1]);
box[2]->Add(box[0]);
box[2]->Add(notebook);
notebookwindow[0]->SetSizer(box[1]);
this->SetSizer(box[2]);
}
bool myapp::OnInit(){
mainwindow *mainfr = new mainwindow( wxT("test"));
mainfr->Show(true);
return true;
}
IMPLEMENT_APP(myapp);
和生成文件
main=test.o
flags=-std=c++11 -g
folders=tables sources
gui=`wx-config --cxxflags --libs`
all: $(addprefix doto/,$(main))
$(CXX) $(flags) $^ $(gui) -o test.exe
doto/%.o:%.cpp %.h
$(CXX) $(flags) $< $(gui) -c -o doto/$(notdir $(<:.cpp=.o))
.PHONY:clean
clean:
rm doto/*.o *.exe
看起来 wxNotebook
喜欢它的页面在添加时完全组装。所以,移动
notebook->AddPage(notebookwindow[0], wxT("This"));
notebook->AddPage(notebookwindow[1], wxT("That"));
就在
之前this->SetSizer(box[2]);
解决了问题。
另一个修复是在完全设置后在笔记本页面本身上强制布局,也就是说,在不更改原始代码中的任何其他内容的情况下,添加
notebookwindow[0]->Layout();
就在
之前this->SetSizer(box[2]);
我不确定是否应将此行为视为错误。我希望在顶级父级上调用 Layout()
以传播到任何地方并避免此类问题,但在这种情况下它看起来不像那样工作。
我现在没有时间进一步调查;如果能得到VZ.的意见就好了