Рисование фона QTableView (с помощью пользовательского QStyledItemDelegate) - PullRequest
1 голос
/ 24 июня 2019

Я пытался использовать пользовательский фон "на ячейку" в (пользовательском) QTableView с использованием (пользовательском) QStyledItemDelegate.Все работает хорошо, пока я на самом деле не пытаюсь получить свой собственный фон.Скажем для примера, я хочу, чтобы все мои ячейки имели красный фон.Вот метод paint моего Delegate.

    QStyleOptionViewItem newOption = option;
    auto normalText = newOption.palette.brush(QPalette::ColorGroup::Normal, QPalette::ColorRole::Text);
    // Works as expected
    newOption.palette.setBrush(QPalette::ColorGroup::Normal, QPalette::ColorRole::Highlight, Qt::gray); // QBrush(Qt::GlobalColor::blue, Qt::BrushStyle::NoBrush));
    // Expected too: selected cells are gray
    newOption.palette.setBrush(QPalette::ColorGroup::Normal, QPalette::ColorRole::HighlightedText, normalText);

    // All of the following do NOT work. I've tried every possible combination without success.
    newOption.palette.setBrush(QPalette::ColorGroup::Normal, QPalette::ColorRole::Window, Qt::red);
    newOption.palette.setBrush(QPalette::ColorGroup::Inactive, QPalette::ColorRole::Base, Qt::red);
    newOption.palette.setBrush(QPalette::ColorGroup::Inactive, QPalette::ColorRole::AlternateBase, Qt::red);
    newOption.palette.setBrush(QPalette::ColorGroup::Active, QPalette::ColorRole::Base, Qt::red);
    newOption.palette.setBrush(QPalette::ColorGroup::Active, QPalette::ColorRole::AlternateBase, Qt::red);
    QStyledItemDelegate::paint(painter, newOption, index);

Как мне этого добиться?Я думал, что мой способ сделать это был довольно простым и интуитивным ... Что здесь не так?

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

В вашем коде есть следующие ошибки:

  • Не используйте метод paint(), если вы хотите настроить свойства QStyleOptionViewItem, поскольку в методе paint() он будет перезаписан методом initStyleOption(), который вызывается внутри.

  • Не все свойства картины получены из QPalette, в случае цвета фона вы должны использовать свойство backgroundBrush.

Учитывая вышеизложенное, решение:

#include <QtWidgets>

class StyledItemDelegate: public QStyledItemDelegate
{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
protected:
    void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override
    {
        QStyledItemDelegate::initStyleOption(option, index);
        QBrush normalText = option->palette.brush(QPalette::ColorGroup::Normal, QPalette::ColorRole::Text);
        option->palette.setBrush(QPalette::ColorGroup::Normal, QPalette::ColorRole::Highlight, Qt::gray);
        option->palette.setBrush(QPalette::ColorGroup::Normal, QPalette::ColorRole::HighlightedText, normalText);
        option->backgroundBrush = QColor(Qt::red);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTableView w;
    StyledItemDelegate *delegate = new StyledItemDelegate(&w);
    w.setItemDelegate(delegate);
    QStandardItemModel model(10, 10);
    w.setModel(&model);
    w.show();

    return a.exec();
}
0 голосов
/ 24 июня 2019

Я знаю, что это неприятно, но если вы пошагаете по источнику QStyledItemDelegate::paint(), в глубине души вы найдете там жестко закодированные значения (например, цвет фона выбранных элементов).

Я закончилвверх рисунок над вместо под QStyledItemDelegate::paint() с полупрозрачным художником / кистью / изображением (после вызова базового класса).

Если поведение выборане важно для вас, попробуйте выполнить картину самостоятельно до , позвонив QStyledItemDelegate::paint() и посмотрите, подходит ли она вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...