C++ 笔记本电脑旁边的大小器和控件

C++ 笔记本电脑旁边的大小器和控件,c++,wxwidgets,sizer,wxnotebook,C++,Wxwidgets,Sizer,Wxnotebook,我在笔记本旁边实现控件时面临布局问题 问题是,笔记本电脑和它旁边的控件按预期正确对齐,但笔记本电脑中第个窗口上的控件彼此重叠,就好像没有使用过测码器一样 我很感激任何关于如何解决这个问题的意见 编辑:提供示例代码来演示问题 标题测试.h: class mainwindow : public wxFrame{ public: mainwindow(const wxString &title); wxWindow *notebookwindow[2]; wxT

我在笔记本旁边实现控件时面临布局问题

问题是,笔记本电脑和它旁边的控件按预期正确对齐,但笔记本电脑中第个窗口上的控件彼此重叠,就好像没有使用过测码器一样

我很感激任何关于如何解决这个问题的意见

编辑:提供示例代码来演示问题

标题测试.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);
//程序测试
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“test.h”
主窗口::主窗口(常量wxString和标题)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(1000800)){
notebook=新的wxNotebook(this,wxID_ANY,wxDefaultPosition,wxSize(200200));
notebookwindow[0]=新的wxWindow(笔记本,wxID_任意);
notebookwindow[1]=新的wxWindow(笔记本电脑,wxID_ANY);
笔记本->添加页面(notebookwindow[0],wxT(“此”));
笔记本->添加页面(notebookwindow[1],wxT(“That”));
onmain[0]=newwxtxtctrl(this,wxID_ANY,wxT(“在main 1上”);
onmain[1]=新的wxtxtctrl(this,wxID_ANY,wxT(“在main 2上”);
onnotebook[0]=新的wxtxtCtrl(notebookwindow[0],wxID_ANY,wxT(“在笔记本1上”);
onnotebook[1]=新的wxtxtCtrl(notebookwindow[0],wxID_ANY,wxT(“在笔记本2上”);
框[0]=新的wxBoxSizer(wxVERTICAL);
框[1]=新的wxBoxSizer(wxVERTICAL);
框[2]=新的wxBoxSizer(wxHORIZONTAL);
框[0]->添加(主[0]);
框[0]->添加(主[1]);
框[1]->添加(在笔记本[0]);
框[1]->添加(在笔记本[1]上);
框[2]->添加(框[0]);
框[2]->添加(笔记本);
notebookwindow[0]->设置器(框[1]);
此->设置器(框[2]);
}
bool myapp::OnInit(){
主窗口*mainfr=新的主窗口(wxT(“测试”));
mainfr->Show(真);
返回true;
}
实施应用程序(myapp);
还有makefile

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 
main=test.o
flags=-std=c++11-g
文件夹=表源
gui=`wx config--cxflags--libs`
全部:$(addprefix doto/,$(main))
$(CXX)$(标志)$^$(gui)-o test.exe
doto/%.o:%.cpp%.h

$(CXX)$(flags)$<$(gui)-c-o doto/$(notdir$)(看起来
wxNotebook
喜欢在添加页面时将其完全组装起来。因此,移动

notebook->AddPage(notebookwindow[0], wxT("This"));
notebook->AddPage(notebookwindow[1], wxT("That"));
就在之前

this->SetSizer(box[2]);
解决了这个问题


另一个修复方法是在完全设置好笔记本页面后,强制在笔记本页面上进行布局,也就是说,在不更改原始代码中的任何其他内容的情况下,添加

notebookwindow[0]->Layout();
就在之前

this->SetSizer(box[2]);

我不确定这种行为是否应该被视为bug。我希望调用顶级父级上的
Layout()
,可以传播到任何地方,避免出现此类问题,但在这种情况下,它似乎不起作用


我现在没有时间进一步调查;如果我们能得到VZ对此的意见,那就太好了。

第一个似乎不起作用,但第二个修复了问题issue@wka奇怪的是,我想知道是什么不同使它在我这边工作。你使用的是什么版本的wx,在什么操作系统上?Ubuntu14.04上的2.8,gcc版本4.8.2@wka我在windows上使用WX3.0.2,这可能解释了差异。