Qt — изменить непрозрачность QPixmap

Как изменить непрозрачность QPixmap?

Я установил изображение в качестве фона, на самом деле я хочу изменить его непрозрачность, вот мой код:

Call.h:

private:
QPixmap m_avatar;

Call.cpp:

void Call::resizeEvent(QResizeEvent *e)
{
QPalette pal = palette();
pal.setBrush(backgroundRole(), m_avatar.scaled(e->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
setPalette(pal);
}

Я изменился resizeEvent функция, но это не меняет прозрачность фона.

void Call::resizeEvent(QResizeEvent *e)
{
QPixmap result_avatar(m_avatar.size());
result_avatar.fill(Qt::transparent);
QPainter painter;
painter.setOpacity(0.5);
painter.begin(&result_avatar);
painter.drawPixmap(0, 0, m_avatar);
painter.end();
QPalette pal = palette();
pal.setBrush(backgroundRole(), result_avatar.scaled(e->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
setPalette(pal);
}

Любое предложение?

3

Решение

Вы не используете местный QPainter объект. В соответствии с События QWidget:

paintEvent() вызывается всякий раз, когда виджет должен быть перекрашен.
Каждый виджет, отображающий пользовательский контент, должен его реализовывать. Картина
используя QPainter может происходить только в paintEvent() или функция
вызывается paintEvent(),

Вот это работает:

void Call::paintEvent(QPaintEvent *)
{
// create a new object scaled to widget size
QPixmap result_avatar = m_avatar.scaled(size());

QPainter painter(this);
painter.setOpacity(0.5);
// use scaled image or if needed not scaled m_avatar
painter.drawPixmap(0, 0, result_avatar);
}

Обновление для рисования в случае растрового изображения

Если это необходимо только рисовать с некоторой непрозрачностью на растровом изображении, используя QPainter, непрозрачность должна быть установлена ​​только после QPainter активация QPainter::begin(), Итак, после изменения порядка растровое изображение result_avatar имеет два изображения (одно изменено с непрозрачностью 1 и оригинальное растровое изображение сверху с непрозрачностью 0,5):

QPainter painter;
painter.begin(&result_avatar);
painter.setOpacity(0.5);
painter.drawPixmap(0, 0, m_avatar);
painter.end()
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]