current - Establecer color en una fila QTableView
qtablewidget rowcount (2)
La vista dibuja el fondo basado en la función Qt::BackgroundRole
de la celda que es el valor de QBrush
devuelto por QAbstractItemModel::data(index, role)
para esa función.
Puede subclasificar QSqlQueryModel
para redefinir data()
para devolver el color calculado, o si tiene Qt> 4.8, puede usar 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 use ese modelo en la vista, con el modelo sql establecido como fuente con QIdentityProxyModel::setSourceModel
.
O
Puede mantener el modelo sin cambios y modificar el fondo con un conjunto de delegados 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())
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.
Pero, ¿cómo puedo configurar el color en una fila según el valor de una celda?
Su mejor opción es definir un modelo personalizado (subclase QAbstractTableModel
). Es probable que desee tener un QSqlQueryModel
como miembro en esta clase personalizada.
Si se trata de un modelo de solo lectura, debe 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 modelos bien educados también
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
Si necesita que el modelo pueda editar / enviar datos, las cosas se complican un poco más y también deberá 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 realmente cambiará una apariencia de fila se encuentra en el valor de retorno de este método:
QVariant data(const QModelIndex &index, int role) const;
Un tonto ejemplo:
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 );
}
}
}