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

Con este método puedo establecer QSQlQueryModels en mis QTableviews.Establecer color en una fila QTableView

Pero, ¿cómo puedo establecer el color en una fila según el valor de una celda?

Respuesta

18

La vista empates el fondo en función del Qt::BackgroundRole papel de la célula que es el valor QBrush devuelto por QAbstractItemModel::data(index, role) para ese rol.

Usted puede subclase el QSqlQueryModel redefinir data() para devolver su color calculado, o si tiene Qt> 4,8, se puede utilizar 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); 
    } 
}; 

y usar ese modelo en la vista, con el sql modelo establecido como fuente con QIdentityProxyModel::setSourceModel.

O

Puede mantener el modelo sin cambios y modificar el fondo con un delegado situado en la 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())); 
    } 
}; 

Como el último método no siempre es obvio para traducir del código C++, aquí está el equivalente en python:

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

+1 para la referencia de la solución con un delegado. Me habia olvidado de eso. – dschulz

+0

necesito establecer un color para cada valor de una tabla colmun (SELECCIONAR nombre, estado FROM usuarios) en este caso "estado" ¿Se puede editar este código? – Tineo

+0

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

3

Su mejor opción es definir un modelo personalizado (subclase QAbstractTableModel). Probablemente desee tener un QSqlQueryModel como miembro en esta clase personalizada.

Si se trata de un modelo de sólo lectura, es necesario implementar al menos estos métodos:

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

y para los modelos de buen comportamiento también

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

Si necesita que el modelo sea capaz de editar/enviar datos, las cosas se complican un poco más y también necesitará implementar estos métodos:

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

Lo que en realidad va a cambiar un aspecto fila radica en el valor de retorno de este método:

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

Un ejemplo tonto:

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); 

     } 
    } 

    } 
Cuestiones relacionadas