Qt установить цвет фона для выбранных QTableWidgetItems - PullRequest
1 голос
/ 27 мая 2019

Я пытался выбрать цвета фона выбранных ячеек в моем 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 Ответ

1 голос
/ 27 мая 2019

Вам также необходимо переопределить делегат элемента.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...