Понимание размеров wxWidgets - PullRequest
0 голосов
/ 06 ноября 2008

Я все еще привыкаю к ​​настройщикам в wxWidgets, и поэтому не могу заставить их делать то, что я хочу.

Я хочу большую панель, которая будет содержать список других панелей / блоков, каждая из которых затем содержит набор текстовых полей

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

Мне также нужно иметь возможность добавлять (в конце) и удалять (где угодно) эти поля. Если их слишком много, чтобы поместиться на вмещающей панели, также требуется вертикальная полоса прокрутки.

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

//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). коробки)?

Ответы [ 3 ]

1 голос
/ 06 ноября 2008

«Если их слишком много, чтобы уместиться на вмещающей панели, также требуется вертикальная полоса прокрутки.»

Вы можете взглянуть на wxScrolledWindow.

«дополнительные добавленные элементы - это просто маленькая коробка в левом верхнем углу главной панели»

Я не уверен, но, возможно, поможет вызов wxSizer :: Layout ().

«Каков наилучший способ выложить содержимое каждой коробки?»

Посмотрите на это sizerdemo . Если не обязательно, чтобы надписи оставались как можно меньше, вы могли бы придать им фиксированную ширину и позволить только текстовым полям расти. Если вы хотите изменить размер при добавлении или удалении новых полей, вы можете реализовать обработчик события OnSize ().

0 голосов
/ 06 ноября 2008

Могу ли я также порекомендовать wxForum , я нашел его очень полезным для вопросов о wxWidgets в прошлом.

Более конкретно для прокрутки wxScrolledWindow должно помочь, используйте wxScrolledWindow-> SetSizer с вашим сайзером верхнего уровня (тот, который содержит ваши элементы управления), чтобы настроить прокручиваемую область, а также проверить образцы, называемые прокруткой, scrollsub и vscroll включены в wxWidgets (в каталоге примеров вашей установки wxwidgets).

0 голосов
/ 06 ноября 2008

Могу ли я предложить вам опубликовать этот вопрос в одном из списков рассылки wxWidgets ? Они смогут помочь вам очень быстро.

...