Domanda

Mi sto ancora abituando ai sizer in wxWidgets e come tale non riesco a farli fare ciò che voglio.

Voglio un pannello di grandi dimensioni che conterrà un elenco di altri pannelli / caselle, che contengono ciascuno una serie di campi di testo

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

Devo anche essere in grado di aggiungere (alla fine) e rimuovere (ovunque) queste caselle. Se ce ne sono troppi da inserire nel riquadro contenente, è richiesta anche una barra di scorrimento verticale.

Questo è quello che ho provato finora, funziona per la prima casella creata con il pannello contenente, ma gli elementi aggiuntivi aggiunti sono solo una piccola casella nella parte superiore sinistra del pannello principale, anche se il codice sizer è lo stesso per tutte le caselle.

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

Inoltre qual è il modo migliore per disporre il contenuto di ogni riquadro? Stavo pensando di utilizzare un ridimensionatore di griglia 2 per 2, ma non sono sicuro di come espandere le caselle di testo in modo che siano le più ampie possibili, mantenendo le etichette il più piccole possibile (ma mantenendo anche l'allineamento tra i 2 testi caselle)?

È stato utile?

Soluzione

" Se ce ne sono troppi per adattarsi al pannello di contenimento, è richiesta anche una barra di scorrimento verticale. "

Puoi dare un'occhiata a wxScrolledWindow.

" ulteriori elementi aggiunti sono solo una piccola casella in alto a sinistra nel pannello principale "

Non ne sono sicuro, ma forse una chiamata a wxSizer :: Layout () sarà di aiuto.

" Qual è anche il modo migliore per disporre il contenuto di ogni riquadro? "

Dai un'occhiata a questo sizerdemo . Se non è obbligatorio, che le etichette rimangano le più piccole possibili, è possibile assegnare alle etichette una larghezza fissa e lasciare crescere solo le caselle di testo. Se desideri adattare le dimensioni quando aggiungi o rimuovi nuove caselle, puoi implementare il gestore eventi OnSize ().

Altri suggerimenti

Posso suggerirti di pubblicare questa domanda in una delle wxWidgets mailing list ? Saranno in grado di aiutarti molto rapidamente.

Posso anche raccomandare le wxForum , l'ho trovato molto utile per le domande su wxWidgets in passato.

Più specificamente per lo scorrimento wxScrolledWindow dovrebbe aiutare, usare wxScrolledWindow & &- SetSizer con il tuo sizer di livello superiore (quello che contiene i controlli) per impostare un'area di scorrimento, controlla anche gli esempi chiamati scroll, scrollsub e vscroll inclusi in wxWidgets (nella directory degli esempi dell'installazione di wxwidgets).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top