2012-04-18 19 views
6
void MyWindow::initializeModelBySQL(QSqlQueryModel *model,QTableView *table,QString sql){ 
     model = new QSqlQueryModel(this); 
     model->setQuery(sql); 
} 

Con questo metodo è possibile impostare un QSQlQueryModels alle mie QTableviews.Imposta il colore su una riga QTableView

Ma come posso impostare il colore su una riga in base al valore di una cella?

risposta

18

La vista richiama lo sfondo in base alla Qt::BackgroundRole ruolo della cella che è il valore QBrush restituito da QAbstractItemModel::data(index, role) per quel ruolo.

È possibile sottoclasse il QSqlQueryModel di ridefinire data() per riportare il colore calcolato, o se si dispone di Qt> 4.8, è possibile utilizzare un QIdentityProxyModel:

class MyModel : public QIdentityProxyModel 
{ 
    QColor calculateColorForRow(int row) const { 
     ... 
    } 

    QVariant data(const QModelIndex &index, int role) 
    { 
     if (role == Qt::BackgroundRole) { 
      int row = index.row(); 
      QColor color = calculateColorForRow(row);   
      return QBrush(color); 
     } 
     return QIdentityProxyModel::data(index, role); 
    } 
}; 

E utilizzare quel modello nella vista, con l'sql modello impostato come sorgente con QIdentityProxyModel::setSourceModel.

O

È possibile mantenere il modello invariato e modificare lo sfondo con un delegato impostato sulla vista con QAbstractItemView::setItemDelegate:

class BackgroundColorDelegate : public QStyledItemDelegate { 

public: 
    BackgroundColorDelegate(QObject *parent = 0) 
     : QStyledItemDelegate(parent) 
    { 
    } 
    QColor calculateColorForRow(int row) const; 

    void initStyleOption(QStyleOptionViewItem *option, 
         const QModelIndex &index) const 
    { 
     QStyledItemDelegate::initStyleOption(option, index); 

     QStyleOptionViewItemV4 *optionV4 = 
       qstyleoption_cast<QStyleOptionViewItemV4*>(option); 

     optionV4->backgroundBrush = QBrush(calculateColorForRow(index.row())); 
    } 
}; 

come ultimo metodo non è sempre evidente di tradurre dal codice C++, ecco l'equivalente in python:

def initStyleOption(self, option, index): 
    super(BackgroundColorDelegate,self).initStyleOption(option, index) 
    option.backgroundBrush = calculateColorForRow(index.row()) 
+1

+1 per il riferimento alla soluzione con un delegato. L'ho dimenticato. – dschulz

+0

ho bisogno di impostare un colore per ogni valore di una tabella colmun (nome SELECT, stato DA utenti) in questo caso "stato" Puoi modificare questo codice. – Tineo

+0

optionV4-> backgroundBrush = QBrush (calculateColorForRow (index.row())); genera errore – Tineo

3

La soluzione migliore è definire un modello personalizzato (sottoclasse QAbstractTableModel). Probabilmente vorrai avere un QSqlQueryModel come membro in questa classe personalizzata.

Se si tratta di un modello di sola lettura, è necessario implementare almeno questi metodi:

int rowCount(const QModelIndex &parent) const; 
int columnCount(const QModelIndex &parent) const; 
QVariant data(const QModelIndex &index, int role) const; 

e per i modelli ben educati anche

QVariant headerData(int section, Qt::Orientation orientation, int role) const; 

Se è necessario il modello per essere in grado di modifica/invia dati, le cose diventano un po 'più coinvolte e dovrai anche implementare questi metodi:

Qt::ItemFlags flags(const QModelIndex &index) const; 
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole); 
bool insertRows(int position, int rows, const QModelIndex &index=QModelIndex()); 
bool removeRows(int position, int rows, const QModelIndex &index=QModelIndex()); 

Cosa cambierà realmente un aspetto fila risiede nel valore di ritorno di questo metodo:

QVariant data(const QModelIndex &index, int role) const; 

Un esempio muto:

QVariant MyCustomModel::data(const QModelIndex &index, int role) const 
{ 
    if (!index.isValid()) 
     return QVariant(); 

    int row = index.row(); 
    int col = index.column(); 


    switch (role) 
    { 

     case Qt::BackgroundRole: 
     { 
      if(somecondition){ 
       // background for this row,col is blue 
       return QVariant(QBrush (QColor(Qt::blue))); 
      } 
      // otherwise background is white 
      return QVariant(QBrush (QColor(Qt::white))); 
     } 

     case Qt::DisplayRole: 
     { 
      // return actual content for row,col here, ie. text, numbers 

     } 

     case Qt::TextAlignmentRole: 
     { 

      if (1==col) 
       return QVariant (Qt::AlignVCenter | Qt::AlignLeft); 

      if (2==col) 
       return QVariant (Qt::AlignVCenter | Qt::AlignTrailing); 

      return QVariant (Qt::AlignVCenter | Qt::AlignHCenter); 

     } 
    } 

    } 
Problemi correlati