2013-03-15 14 views
6

perplessi da questa omissione - ma nella classe di Qt QAbstractItemView, è possibile impostare un QAbstractItemDelegate (cioè QItemDelegate o QStyledItemDelegate) per l'intera vista, una singola riga o una singola colonna, usando i metodi setItemDelegate*. Inoltre, è possibile interrogare l'elemento delegato per una singola cella, con QAbstractItemView::itemDelegate(const QModelIndex&), insieme al delegato per righe e colonne. e l'intera vista. Ma sembra che non ci sia modo di impostare un elemento delegato a una singola cella. Mi sto perdendo qualcosa? Qualche ragione dovrebbe essere?Come impostare un delegato per una singola cella nella visualizzazione delle voci Qt?

risposta

4

No, non è possibile impostare l'elemento delegato solo per una cella o una colonna, ma è possibile impostare facilmente l'oggetto delegato per l'intero widget e scegliere in quale cella, colonna o riga si desidera utilizzare la pittura personalizzata o qualcosa del genere.

Ad es.

void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, 
         const QModelIndex &index) const 
{ 
    if (index.column() == 1) 
    { 
     // ohh it's my column 
     // better do something creative 
    } 
    else // it's just a common column. Live it in default way 
     QItemDelegate::paint(painter, option, index); 
} 

Potete trovare qualche informazione in più here

+0

Questa è la mia prima volta con i delegati - il tuo metodo, se il delegato I set è una casella di selezione, la modifica verrebbe visualizzata solo per la colonna 1? La gamma di spinbox non sarebbe in vigore per le altre colonne? –

+0

Tutte le cose interesseranno solo la colonna numero 1. Tutte le altre colonne saranno saty come erano prima. – Blood

+0

OK, ma con questo metodo è possibile avere più di un tipo di delegato specifico della cella? Potresti avere una spinbox a (0,2) e una barra di avanzamento a (3,1) con delegati di default ovunque? –

2

io raccomanderei reimplementare funzione createEditor invece:

QWidget * WidgetDelegate::createEditor(
     QWidget *parent, 
     const QStyleOptionViewItem &, 
     const QModelIndex &index) const 
{ 
    QWidget *widget = 0; 
    if (index.isValid() && index.column() < factories.size()) 
    { 
     widget = factories[index.column()]->createEditor(index.data(Qt::EditRole).userType(), parent); 
     if (widget) 
      widget->setFocusPolicy(Qt::WheelFocus); 
    } 
    return widget; 
} 
Problemi correlati