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.