2015-03-14 2 views
0

Я столкнулся с проблемами макета, реализующими элементы управления рядом с ноутбуком.sizers и органы управления рядом с ноутбуками

Проблема в том, что блокнот и элементы управления рядом с ним правильно выровнены по назначению, но те, что находятся на одном из окон в ноутбуке, расположены друг на друге, как если бы не использовался разделитель.

Я ценю любой вход, как исправить это.

редактировать: при условии, пример кода, чтобы продемонстрировать проблему

Заголовок 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 

ответ

0

It выглядит как 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.

+0

первый, похоже, не работает, но 2-й бит исправил проблему –

+0

@wka Странно, интересно, какая разница, что заставило ее работать на моей стороне. Какую версию wx вы используете и на какой ОС? – bogdan

+0

2.8 на ubuntu 14.04, gcc версия 4.8.2 –

Смежные вопросы