2011-11-15 12 views
5

Ho una QListView con selezione multipla con un delegato oggetto (QStyledItemDelegate) che utilizzo per impostare la dimensione per gli articoli e per la verniciatura personalizzata. I miei requisiti sono estremamente semplici:QTListView con delegato oggetto - Righe di articoli più alti per gli articoli selezionati

  1. Altezza riga 30 per gli elementi non selezionati
  2. altezza di riga 60 per gli elementi selezionati

Non può ottenere questo lavoro.

provato ad utilizzare il sizehint sul mio QStyledItemDelegate

if (option.state & QStyle::State_Selected) 
{ 
    return QSize(100,60); /// <<<<------ NEVER REACHED 
} 
else 
{ 
    return QSize(100,30); 
} 

Lo stato non è mai stato selezionato che è strano perché la stessa istruzione if funziona perfettamente per il metodo di pittura sulla stessa classe, distinguendo tra le righe selezionate e non selezionate righe per diversi colori di sfondo.

Poi ho cercato qualcosa di diverso

ho fatto il modello di selezione (QItemSelectionModel) accessibile al metodo sizehint sul mio delegato. Usando questo posso interrogare correttamente se la riga su cui è chiamato sizehint è selezionata o meno e sto restituendo la dimensione corretta. Tuttavia ora solo il disegno viene eseguito nella dimensione della variabile corretta. per gli elementi selezionati, il disegno ora ha un'altezza di 60, che è corretta, ma si sovrappone agli elementi sottostanti. In altre parole: la nuova dimensione sizeHint viene utilizzata solo per DRAWING, ma non per rendere effettivamente l'elemento QListView più alto. Sembra che ci sia una chiamata mancante per "aggiornare" il listView che uno dei suoi elementi è cambiato in dimensioni. Non ho bisogno solo di disegnare l'oggetto più alto, ho bisogno dell'oggetto per essere più alto per quello scopo.

Sembra che sizeHint abbia solo influenza sull'altezza dell'elemento all'inizio quando tutto è inizializzato. se all'improvviso restituisci un valore di altezza più alto per uno degli elementi di sizeHint, non aumenterà il listview per adattarsi alla nuova altezza.

Un interessante osservazione:

se ho impostato setResizeMode (QListView :: Adjust) sul mio QListView, un leggero ridimensionamento al controllo attiverà un re-calc di tutti gli elementi, fissare la dimensione del l'elemento selezionato effettivo come il disegno (che viene sempre eseguito nell'altezza corretta) non si sovrappone al di sotto dell'oggetto in quanto l'altezza dell'oggetto è ora corretta. Questo è ciò che ho bisogno di fare come modifiche di selezione, causare un "ricalcolo" come le cause QLiustView :: Adjust. Come lo faccio?

Quello che sto facendo ora è brutto, e sono sicuro che non è il modo di farlo, ma non ho altra alternativa. Sto collegando il modello di selezione - ascoltando i cambi di selezione, e quando arrivano, ridimensiono l'altezza del mio QlistView di 1 e poi torno alla dimensione originale. Questo genera un ricalcolo delle dimensioni degli articoli (setResizeMode (QListView :: Adjust) e tutto sembra funzionante e va bene. Ho solo la nausea di dover fare questo-- non c'è modo migliore per far ricalcolare gli oggetti la loro altezza NON fingendo un ridimensionamento di QListView?

risposta

1

Confermato con i migliori sviluppatori di Nokia Qt - L'hack che sto facendo a quanto pare è l'unico modo per ottenere questa cosa fatta:

Quello che sto facendo ora è brutto, e sono sicuro che sia non è il modo di farlo, ma non ho altra alternativa. Sto collegando il modello alla selezione - ascoltando i cambiamenti di selezione, e quando arrivano, ridimensiono l'altezza di mio QlistView di 1 e poi torno alla dimensione originale. Questo genera un nuovo calcolo della voce dimensioni (setResizeMode (QListView :: Regolazione) e tutto ciò che appare e funziona bene.

Problemi correlati