【问题标题】:sizers and controls next to notebooks笔记本旁边的大小调整器和控件
【发布时间】:2015-03-14 15:29:36
【问题描述】:

我在笔记本旁边实现控件时遇到布局问题。

问题是,笔记本和它旁边的控件按预期正确对齐,但笔记本中第一个窗口上的控件被放置在彼此的顶部,就好像没有使用大小调整器一样。

感谢任何形式的意见如何解决这个问题。

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

头文件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);

和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 

【问题讨论】:

    标签: c++ wxwidgets sizer wxnotebook


    【解决方案1】:

    看起来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. 的意见,那就太好了。

    【讨论】:

    • 第一个似乎不起作用,但第二个解决了问题
    • @wka 奇怪,我想知道它在我身边有什么不同。你使用的是什么版本的 wx,在什么操作系统上?
    • ubuntu 14.04 上的 2.8,gcc 版本 4.8.2
    • @wka 我在 Windows 上使用 wx 3.0.2,这可能解释了差异。
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 2013-10-29
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多