Qual è il modo migliore per fare un QTableView cellule hanno su e giù pulsante premuto stati in Qt?

StackOverflow https://stackoverflow.com/questions/970618

Domanda

Sto cercando di rendere le cellule di un QTableView sembrano pulsanti cliccabili 3D. In modo che quando si fa clic su una cella, gli sguardi pulsante premuto. Tutti sembrano pensare che solo voglia di cambiare il colore, ho bisogno di mostrare immagini di un normale pulsante, e un pulsante premuto, che guardano a 3 dimensioni.

L'ho fatto già con chiamando QTableView::setItemDelegate(), con una adeguata ItemDelegate che cambierà lo sfondo della cella quando viene cliccato. Tuttavia Sono bloccato a questo punto perché voglio alcune cellule da diversi pulsanti colorati in base ai dati in essi contenuti. Quindi, una cella con un numero basso sarebbe un pulsante rosso, che è anche rosso quando viene cliccato, e le altre cellule sarebbero diversi colori.

Posso impostare il colore del pulsante con il TableModel, ma una volta che il pulsante viene premuto, non v'è alcun modo per il ItemDelegate sapere che si suppone essere un colore diverso rispetto al resto. Come è possibile collegare i due in modo che il ItemDelegate sa di che colore dovrebbe essere?

Inoltre, c'è semplicemente un modo migliore per rendere le cellule sembrano bottoni?

È stato utile?

Soluzione

È possibile chiamare QModelIndex::model() dall'interno metodo ItemDelegate del paint(), dal momento che ha un parametro QModelIndex. Questo vi dà la TableModel per i dati, che possono essere programmaticamente decidere quale colore pulsante della cella sarà.

Tuttavia, questo non è ancora elegante come mi auguro. Qualcuno sa un modo migliore per modificare l'aspetto delle celle della tabella, quando in entrambi i su e giù per gli stati PULSANTE?

Altri suggerimenti

Perché non ha chiesto l'indice per il colore di sfondo.

qualcosa di simile ...

QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) ); 
//...

Ho la sensazione che la sua un bug in Qt e il suo deve essere stato ...

// model code  
if(role==Qt::BackgroundColorRole )
    return qvariant_cast<QBrush>( QBrush(Qt::red) );

// delegate code 
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );

Perché il optionV4.backgroundBrush è corretto nel metodo sizeHint ma non è valida nel metodo paint. Vedo ora motivo per cui l'sizeHint dovrebbe avere il pennello di sfondo e il metodo di non paint. Io segnalarlo a Nokia.

EDIT:
Sembra che io avevo ragione e il suo un bug in QStyleOptionViewItemV4 non copia l'icona e backgroundBrush

Non è possibile ottenere il numero di ID / riga della riga della cella della tabella e quindi controllare contro la tavola dei colori che si potrebbe avere, e impostare il colore di conseguenza? Non sono sicuro se ho capito bene o no la tua domanda.

assegnare un ruolo di dati per il colore di sfondo, e nel vostro articolo delegato, chiedere l'indice modello di quello che è il colore di sfondo è (usando data( bg_color_role ) o qualcosa di simile). Poi, nel modello, è necessario assicurarsi che la funzione di dati restituisce un colore per la bg_color_role che è appropriato per i dati che vengono modellati.

Il modo per farlo è quello di utilizzare il metodo di dati dell'oggetto QModelIndex di salire sul metodo paint, e chiedere un ruolo specifico (se si definisce un modello personalizzato, è possibile aggiungere i propri ruoli, e dare le informazioni è necessario il delegato in quei ruoli.)

TIMW, io penso che si debba compilare informazioni QStyleOptionViewItemV4 chiamando initStyleOption prima.

Non sono sicuro di dove il requisito di un'immagine di sfondo proviene. Se si desidera che le celle a guardare come QPushButtons, probabilmente si dovrebbe ereditare da QItemDelegate e implementare paint() utilizzare QStyle per disegnare un QPushButton, qualcosa di simile:

QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );

Hai provato a usare i fogli di stile personalizzato?

Si potrebbe semplicemente applicare lo stesso foglio di stile ad ogni cellula, e quindi modificare l'immagine di sfondo / stile per disegnare le immagini dei pulsanti 3D a seconda se o non è stato selezionato.

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