【问题标题】:Qt- Change opacity of QPixmapQt - 改变 QPixmap 的不透明度
【发布时间】:2015-10-04 15:33:58
【问题描述】:

如何改变 QPixmap 的不透明度?

我已将图像设置为背景,实际上我想更改其不透明度,这是我的代码:

Call.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);
}

有什么建议吗?

【问题讨论】:

  • 你运行的是什么操作系统?
  • Qt 支持的众多版本中的哪一个?
  • 警告:某些样式不会使用调色板进行所有绘图,例如,如果它们使用本机主题引擎。 Windows XP、Windows Vista 和 Mac OS X 样式都是这种情况。

标签: c++ css qt opacity


【解决方案1】:

您没有使用本地 QPainter 对象。根据QWidget Events

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);
}

pixmap 情况下的绘画更新

如果只需要使用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()

【讨论】:

  • 这个只在绘制到一个widget上时代表,他正在绘制到一个像素图上,你可以从任何你想要的地方绘制到一个像素图上。
  • 作者尝试将调色板设置为小部件,并将像素图纹理调整为小部件大小。这个问题的关键是“实际上将图像设置为背景”。
  • 我认为“实际上”实际上是“实际上我想改变它的不透明度”的一部分。他没有在其绘制事件之外的小部件上进行绘制,他设置了一个调色板,我从逻辑上假设设置调色板将调用默认的绘制事件。文档中没有说需要在绘制事件方法中设置调色板。
  • @ddriver 感谢您指出确实主要问题是在不透明的像素图上绘画。我通过解释如何解决问题来更新我的答案。
  • 你测试解决方案了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多