QTableView, установка шрифта и цвета фона ячейки
Я использую QTableView и QStandardItemModel, и я пытаюсь закрасить строку с оставшимся черным шрифтом.
Я использую метод рисования моего класса делегата:
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QBrush brush(Qt::red, Qt::SolidPattern);
painter->setBackground(brush);
}
Это не работает вообще и делает текст внутри каждой ячейки прозрачным. Что я здесь не так делаю?
[ПРАВКА] Я использовал painter->fillRect(option.rect, brush);
также, но это делает фон ячейки и текст одинакового цвета.
3 ответа
Решение
Ваш Delegate
должен наследовать QStyledItemDelegate
,
Ваше событие рисования, вероятно, должно выглядеть так:
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem op(option);
if (index.row()==2) {
op.font.setBold(true);
op.palette.setColor(QPalette::Normal, QPalette::Background, Qt::Black);
op.palette.setColor(QPalette::Normal, QPalette::Foreground, Qt::White);
}
QStyledItemDelegate::paint(painter, op, index);
}
Как предположил Ваанчо, вы можете использовать QStandardItem::setData()
функция:
QStandardItem item;
item.setData(QColor(Qt::green), Qt::BackgroundRole);
item.setData(QColor(Qt::red), Qt::FontRole);
Или QStandardItem::setBackground()
а также QStandardItem::setForeground()
функции:
QStandardItem item;
item.setBackground(QColor(Qt::green));
item.setForeground(QColor(Qt::red));
Это сработало для меня:
class TableViewDelegateWritable : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit TableViewDelegateWritable(QObject *parent = 0)
: QStyledItemDelegate(parent)
{
}
// background color manipulation
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QColor background = QColor(135, 206, 255); // RGB value: https://www.rapidtables.com/web/color/blue-color.html
painter->fillRect(option.rect, background);
// Paint text
QStyledItemDelegate::paint(painter, option, index);
}
// only allow digits
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setMinimum(-99999);
editor->setMaximum(99999);
return editor;
}
};
Затем в main() присвойте делегату табличное представление следующим образом:
for(int c = 0; c < ui->tableView->model()->columnCount(); c++)
{
ui->tableView->setItemDelegateForColumn(c, new TableViewDelegateWritable(ui->tableView));
}