QTableView,设置单元格的字体和背景颜色

时间:2016-02-23 10:55:03

标签: qt delegates qtableview qpainter

我正在使用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 个答案:

答案 0 :(得分:2)

您的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);
}

答案 1 :(得分:2)

建议 vahancho ,您可以使用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));

答案 2 :(得分:0)

  

这对我有用:

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