Qt为选定的QTableWidgetItems设置背景色

时间:2019-05-27 14:53:13

标签: c++ qt

我一直在尝试选择QTableWidget中所选单元格的背景颜色。我使用具有以下QTableWidgetItem方法的自定义data

QVariant MyItem::data(int role) const
{
    if (role == Qt::BackgroundRole)
    {
        if (isSelected())
            return QBrush(Qt::green);
        else
            return QBrush(Qt::blue);
    }
}

但是,它不能按预期工作:

screenshot of my qtablewidget

我目前还不知道该怎么办...请提出建议!

注意:在简单的情况下,我可以编辑我的QSS以添加项目的背景色,但是我想在data的流程中添加条件,并且使用QSS将不会那样容易。

1 个答案:

答案 0 :(得分:1)

您还需要重新实现项目委托。

class ColoredItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit ColoredItemDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

};

void ColoredItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                                const QModelIndex &index) const
{
    if (option.state.testFlag(QStyle::State_Selected))
    {
        QStyleOptionViewItem newOption(option);
        newOption.palette.setBrush(QPalette::Normal, QPalette::Highlight,
                                   index.data(Qt::BackgroundRole).value<QBrush>());
        QStyledItemDelegate::paint(painter, newOption, index);
        return;
    }

    QStyledItemDelegate::paint(painter, option, index);
}