Pregunta

Todavía me estoy acostumbrando a los dimensionadores en wxWidgets, y como tal parece que no puedo hacer que hagan lo que quiero.

Quiero un panel grande que contendrá una lista de otros paneles / cuadros, que luego contienen un conjunto de campos de texto

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

También necesito poder agregar (al final) y eliminar (en cualquier lugar) estos cuadros. Si hay demasiados para caber en el panel contenedor, también se requiere una barra de desplazamiento vertical.

Esto es lo que he intentado hasta ahora, funciona para el primer cuadro que se crea con el panel contenedor, pero los elementos adicionales agregados son solo un pequeño cuadro en la parte superior izquierda del panel principal, aunque el código de tamaño es lo mismo para todas las cajas.

//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();
}

¿Cuál es la mejor manera de diseñar el contenido de cada cuadro? Estaba pensando en usar un tamaño de cuadrícula de 2 por 2, pero no estoy seguro de cómo hacer que los cuadros de texto se expandan para que sean lo más anchos posibles, mientras que las etiquetas permanecen lo más pequeñas posible (pero también manteniendo la alineación entre el texto 2 cajas)?

¿Fue útil?

Solución

" Si hay demasiados para caber en el panel contenedor, también se requiere una barra de desplazamiento vertical. "

Podría echar un vistazo a wxScrolledWindow.

" los elementos adicionales agregados son solo un pequeño cuadro en la parte superior izquierda del panel principal "

No estoy seguro, pero tal vez una llamada a wxSizer :: Layout () ayudará.

" ¿Cuál es la mejor manera de diseñar el contenido de cada cuadro? "

Eche un vistazo a este sizerdemo . Si no es obligatorio, que las etiquetas se mantengan lo más pequeñas posible, puede darles un ancho fijo y dejar que crezcan los cuadros de texto. Si desea adaptar el tamaño al agregar o eliminar cuadros nuevos, puede implementar el controlador de eventos OnSize ().

Otros consejos

¿Puedo sugerirle que publique esta pregunta en una de las wxWidgets mailing list ? Podrán ayudarlo muy rápidamente.

¿Puedo recomendar también el wxForum , lo he encontrado muy útil para las preguntas de wxWidgets en el pasado.

Más específicamente para desplazarse wxScrolledWindow debería ayudar, use wxScrolledWindow- >t SetSizer con su medidor de nivel superior (el que contiene sus controles) para configurar un área desplazada, también consulte las muestras llamadas scroll, scrollsub y vscroll incluidas en wxWidgets (en el directorio de muestras de la instalación de wxwidgets).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top