Как изменить непрозрачность 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);
}
Любое предложение?
Вы не используете местный 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()
Других решений пока нет …