Вопрос

Я все еще привыкаю к сайзерам в 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, но я не уверен, как сделать так, чтобы текстовые поля расширялись настолько широко, насколько это возможно, при этом метки оставались как можно меньше (но также сохраняли выравнивание между двумя текстовыми полями)?

Это было полезно?

Решение

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

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

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

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

"И еще, как лучше всего разложить содержимое каждой коробки?"

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top