Qt-更改QPixmap的不透明度

Qt- Change opacity of QPixmap

本文关键字:不透明度 QPixmap 更改 Qt-      更新时间:2023-10-16

如何更改QPixmap的不透明度?

我已经设置了一个图像作为背景,实际上我想改变它的不透明度,这是我的代码:

呼叫.h:

private:
    QPixmap m_avatar;

调用.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()或函数中由CCD_ 5调用

它在这里工作:

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::begin()激活QPainter之后设置。因此,在改变顺序后,像素图result_avatar有两个图像(一个调整大小为不透明度1,原始像素图在顶部为不透明度0.5(:

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