2012-05-13 2 views
1

Я пытаюсь запрограммировать интерфейс для приложения-графика. На моей главной вкладке должны быть два списка (один над другим). Но это кажется невозможным (я сидел вчера полдня и сегодня еще три часа). Так что это мой результат:wx * layout in wxNotebookPage

enter image description here

И это общая часть моего кода:

// LayoutManagement - Main 
    sizer = new wxBoxSizer(wxVERTICAL); 
    this->SetSizer(sizer); 

    // Tabpane 
    tab_pane = new wxNotebook(this,TAB_PANE); 
    sizer->Add(tab_pane,1,wxEXPAND); 

    // Overview tab 
    wxBoxSizer *ot_sizer = new wxBoxSizer(wxVERTICAL); 
    overview_tab = new wxNotebookPage(tab_pane,TAB_OVERVIEW); 
    overview_tab->SetSizer(ot_sizer); 
    tab_pane->AddPage(overview_tab,_("Countdown und Nachrichten"),true); 

    // Schedule 
    schedule_list = new wxListBox(overview_tab, SCHEDULE_LIST); 
    ot_sizer->Add(schedule_list,1,wxEXPAND); 

    // NewsList 
    news_list = new wxListBox(overview_tab,NEWS_LIST); 
    ot_sizer->Add(news_list,3,wxEXPAND); 

И мой заголовок (часть):

wxListBox *schedule_list; 
    wxBoxSizer *sizer; 
    wxListBox *news_list; 
    wxNotebook *tab_pane; 
    wxNotebookPage *overview_tab, *settings_tab, *about_end_tab; 

Что я делать не так?

Привет

Майкл

(Извините за мой плохой английский)

ответ

0

Причина, этот код не работает в том, что вы назвали SetSizer() перед добавлением виджетов в классификаторе. Вы должны либо перевести вызов в SetSizer ПОСЛЕ добавления виджетов в sizer, либо заставить sizer повторить компоновку после добавления.

ot_sizer->Add(news_list,3,wxEXPAND); 

// all widgest added to sizer, now arrange layout as specified 
ot_sizer->Layout(); 

Это должно исправить ваш код на данный момент.

Последний комментарий к структуре вашего кода: вы, кажется, строите все в одном большом разделе кода. Это не отличная идея. По мере того, как вы продолжаете добавлять элементы в свой графический интерфейс, это будет очень запутанным. Лучше подклассы каждой страницы и создавать виджеты, принадлежащие каждой странице в конструкторе этой страницы.

class cOverviewTab : public wxNotebookPage 
{ 
public: 
cOverviewTab() : wxNotebookPage(tab_pane,TAB_OVERVIEW) 
{ 
    wxBoxSizer *ot_sizer = new wxBoxSizer(wxVERTICAL); 
    ot_sizer->Add(new wxListBox(overview_tab, SCHEDULE_LIST)); 
    ot_sizer->Add(new wxListBox(overview_tab,NEWS_LIST)); 
    SetSizer(ot_sizer); 
} 
}; 
+0

Хорошо, скорректируйте код. Кажется, что ошибка в wxW. 2.8, если я использую ваш вариант Add (только с одним параметром), тогда будут показаны оба поля. Но есть еще одна ошибка: списки не будут расширены. Поэтому я попытался установить SizerFlags через класс 'wxSizerFlags', но это тоже не работает. Попробовали [this] (http://wiki.wxwidgets.org/WxSizer#Window_Size_is_Very_Small) тоже. (не смогли) –

0

У меня была та же проблема, и мне потребовалось около 2 часов, чтобы исправить это.

Нет причин менять другие строки в коде. Вы должны использовать только класс wxPanel вместо wxNotebookPage, чтобы создать новые страницы для объекта wxNotebook. Это связано с тем, что wxNotebookPage всего лишь typedef от wxWindow и wxWindow не имеет каких-либо необходимых функциональных возможностей, которые имеет wxPanel.

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