QTableWidget: как покрасить невыделенную текущую строку?

В таблице по умолчанию можно задать цвет фона выделенных или невыделенных ячеек для разных состояний таблицы, например, через QPalette:

...
  QPalette pal;
  pal.setColor(QPalette::Active,   QPalette::Base, Qt::white);
  pal.setColor(QPalette::Inactive, QPalette::Base, Qt::lightGray);
  pal.setColor(QPalette::Active,   QPalette::Highlight, Qt::blue);
  pal.setColor(QPalette::Inactive, QPalette::Highlight, Qt::gray);
  pal.setColor(QPalette::Active,   QPalette::HighlightedText, Qt::white);
  pal.setColor(QPalette::Inactive, QPalette::HighlightedText, Qt::white);
  ui->table->setPalette(pal);
  styleFocus = ui->table->styleSheet();                      //save normal stylesheet
...

Мне нужно изменить фон текущей строки, когда таблица находится в фокусе. Делаю это при помощи setData:

...
void MainWindow::on_table_currentCellChanged(int curRow, int curCol, int prevRow, int prevCol)
{
  if (!ui->table->item(curRow, 0)->isSelected())
  {
    for (int i = 0; i < ui->table->columnCount(); ++i)
     ui->table->item(curRow, i)->setData(Qt::BackgroundColorRole, QVariant(QColor(Qt::green)));
  }
  if (prevRow >= 0)
  {
    for (int i = 0; i < ui->table->columnCount(); ++i)
      ui->table->item(prevRow, i)->setData(Qt::BackgroundColorRole, QVariant(QColor(Qt::white)));
  }
}
...

Когда таблица в фокусе, всё выглядит, как должно быть: невыделенные строки - white, выделенные - blue, текущая невыделенная - green. Однако, когда таблица теряет фокус, все строки становятся lightGray или gray, как задано палитрой, кроме строк, покрашенных "вручную". Т.е. текущая остаётся зелёной, а другие, когда либо подвергнутые перекраске - белыми, а не серыми, как мне надо. Перекраску таблицы при потере фокуса делаю в eventFilter, т.к. без этого автоматически перекрашиваются (в gray) только выделенные строки, а вся таблица почему-то остаётся white, а не lightGray, как задано в палитре:

...
bool MainWindow::eventFilter(QObject* object, QEvent* event)
{
  if(object == ui->table && event->type() == QEvent::FocusIn)
  {
    ui->table->setStyleSheet(styleFocus);
  }
  else if(object == ui->table && event->type() == QEvent::FocusOut)
  {
    ui->table->setStyleSheet("QTableWidget {background-color: lightgray;}");
  }
  return QWidget::eventFilter(object, event);
}
...

Как сделать так, чтобы всегда зелёной оставалась только текущая невыделенная строка, а все остальные выглядели одинаково - в соответствии с выделением и наличием фокуса?

Кажется, нашёл простой вариант, который меня почти устраивает (в QEvent::FocusOut):

setStyleSheet("QTableView::item:selected { color:white; background:gray;}"
                               "QTableView::item {background:lightgray;}")

Нужно только каким-то образом указать в setStyleSheet конкретную (текущую) строку, которую надо покрасить. Если это возможно. Пока не знаю, как это прописать в setStyleSheet.


Ответы (0 шт):