1

我一直在尝试在我的QTableWidget. 我使用QTableWidgetItem具有以下data方法的自定义:

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

但是,它没有按预期工作:

我的 qtablewidget 的屏幕截图

我现在真的不知道该怎么做......请建议!

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

4

1 回答 1

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);
}
于 2019-05-27T16:37:19.567 回答