2008-11-06 45 views
0

我還是習慣了wxWidgets中的sizers,並且似乎無法讓它們按照我想要的來做。瞭解wxWidgets sizer

我希望有一個大面板將包含其它面板/箱列表,其中每個隨後包含一系列的文本字段

---------------------- 
| label text box | 
| label2 text box2 | 
---------------------- 
---------------------- 
| label text box | 
| label2 text box2 | 
---------------------- 
---------------------- 
| label text box | 
| label2 text box2 | 
---------------------- 

我還需要能夠(在末尾)添加的,並刪除(任何地方)這些箱子。 如果包含面板太多,則需要使用垂直滾動條。

這是我到目前爲止所嘗試的,它適用於使用包含面板創建的第一個框,但其他附加項只是主面板左上角的一個小框,即使sizer代碼對於所有盒子都是一樣的。

//itemsList is a container containg a list of *Item pointers to each box/panel/whatever the right name is 
Items::Items(wxWindow *parent) 
:wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SUNKEN) 
{ 
    //one sstarting item 
    OnAdd(wxCommandEvent()); 
} 

void Items::OnAdd(wxCommandEvent &event) 
{ 
    unsigned id = itemsList .size(); 
    Item *item = new Item(this,id); 
    itemsList .push_back(item); 

    RebuildSizer(); 
} 
void Items::RebuildSizer() 
{ 
    this->SetSizer(0,true); 
    wxBoxSizer *sizerV = new wxBoxSizer(wxVERTICAL); 

    for(std::vector<Item*>::iterator it = itemsList .begin(); it != itemsList .end(); ++it) 
     sizerV->Add(*it, 1, wxEXPAND | wxLEFT | wxRIGHT, 5); 

    SetSizer(sizerV); 
} 
void Items::OnRemove  (wxCommandEvent &event, unsigned itemId) 
{ 
    delete itemsList [itemId]; 
    itemsList .erase(items.begin()+itemId); 
    for(std::vector<Item*>::iterator it = itemsList .begin()+itemId; it != itemsList .end(); ++it) 
     (*it)->ChangeId(itemId++); 

    RebuildSizer(); 
} 

另外什麼是最好的方式來佈局每個盒子的內容?我正在考慮使用2×2的網格尺寸,但我不確定如何使文本框擴大到儘可能寬,同時使標籤保持儘可能小(但也保持2個文本之間的對齊盒)?

回答

1

「如果太多,以適應包含面板一個垂直滾動條也是必需的。」

你可以看看wxScrolledWindow。

「額外添加的項目都在主面板的左上角只是一個小盒子」

我不知道),但是,也許到一個wxSizer ::佈局(呼叫會有所幫助。

「另外最好的方式來佈局每個盒子的內容?

看看this sizerdemo。如果不是強制性的,標籤保持儘可能小,你可以給標籤固定的寬度,只讓文本框增長。如果要在添加或刪除新框時調整大小,可以實現OnSize()事件處理程序。

0

我也可以推薦wxForum,我發現它對過去的wxWidgets問題非常有用。

更具體地滾動wxScrolledWindow應該幫助,使用wxScrolledWindow-> SetSizer與頂級分級器建立一個滾動區域(包含您的控件之一),還檢查了樣品被稱爲滾動,scrollsub和VSCROLL列入wxWidgets(在你的wxwidgets安裝目錄下)。