QLabel с растровым изображением: предотвратить изменение цвета растрового изображения в отключенном состоянии - PullRequest
0 голосов
/ 03 мая 2018

Как я могу контролировать цвет его растрового изображения в отключенном состоянии метки?

По некоторым странным причинам мне нужно иметь точно такой же вид растрового изображения в активном и отключенном состоянии (отображается логотип).

Растровое изображение, которое я положил на QLabel с label->setPixmap(pm), всегда отображается другим цветом, чем активное состояние, когда метка находится в отключенном состоянии.

Я боролся с таблицей стилей и пробовал QFrame:disabled{background-color: rgba(..., ..., ..., 255);}, но часть метки, которая покрыта растровым изображением, всегда представляет собой смесь с другим цветом, который, кажется, исходит от контроля Qt за отключенным состоянием.


EDIT: похоже, Qt всегда смешивает цвет растрового изображения и цвет фона в отключенном состоянии. Но Qt не смешивает цвета в активном состоянии; тогда цвет растрового изображения остается непрозрачным. Мне нужно отключить это поведение смешивания в отключенном состоянии.

1 Ответ

0 голосов
/ 03 мая 2018

A (не такой уж сложный способ), чтобы нарисовать растровое изображение самостоятельно. Вместо того, чтобы создавать подклассы QLabel и переопределять paintEvent, вы можете установить фильтр событий в свой ярлык и прослушивать только QPaintEvent.

Есть фильтр:

class Filter : public QObject
{
    Q_OBJECT
public:
    Filter(): QObject(nullptr) {}
    bool eventFilter(QObject *watched, QEvent *event);
};

В методе eventFilter всегда возвращается false, но при рисовании растрового изображения:

#include <QPaintEvent>
#include <QPainter>
#include <QStyle>
bool Filter::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == QEvent::Paint)
    {
        QLabel * label = dynamic_cast<QLabel*>(watched);
        QPainter painter(label);

        QPixmap pixmap = label->pixmap()->scaled(label->size());        
        label->style()->drawItemPixmap(&painter, label->rect(), Qt::AlignHCenter | Qt::AlignVCenter, pixmap);
        return true;
    }
    return false;
}

Создание и установка фильтра, что-то вроде:

ui->setupUi(this);
Filter * filter = new Filter();
ui->label->installEventFilter(filter);

/* don't forget to call: 

    delete filter;

  somewhere later */

В моем примере кода я масштабировал растровое изображение, чтобы он соответствовал размеру метки, и отцентрировал его по горизонтали и вертикали, но вы можете настроить все это в соответствии со своими потребностями.

Кроме того, один и тот же фильтр может быть установлен более чем на одну метку, поскольку логика для них всех работает нормально. Подробнее о фильтрации событий здесь .

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