gpt4 book ai didi

c++ - QPainter 组合在背景下无法按预期工作

转载 作者:行者123 更新时间:2023-11-30 01:44:03 26 4
gpt4 key购买 nike

我正在尝试在具有白色背景的 QFrame 上绘制两个具有相同颜色和透明度的矩形。这些矩形应该重叠并且它们的透明度不应该改变(也在重叠区域)。所以像这样:

enter image description here

这是我目前的代码:

class Canvas : public QFrame
{
public:
void paintEvent(QPaintEvent * event) override;
};

void Canvas::paintEvent(QPaintEvent *event)
{
QPainter painter( this );

painter.setPen(QPen(Qt::NoPen));
painter.setBrush(QBrush(QColor(0,0,255,125)));

painter.drawRect(QRect(10,10,100,100));
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.setBrush(QBrush(QColor(0, 0, 255, 125)));
painter.drawRect(QRect(80, 80, 100, 100));
}

int main( int argc, char **argv )
{
QApplication a( argc, argv );

Canvas canvas;
canvas.setAutoFillBackground(true);
QPalette pal;
pal.setColor(QPalette::Window, QColor(Qt::red));
canvas.setBackgroundRole(QPalette::Window);
canvas.setPalette(pal);
canvas.show();

return a.exec();
}

但是这会产生以下图像:

enter image description here

我已经为画家尝试了所有可能的构图模式,但似乎没有一种能给我想要的效果。我想 CompositionMode_Source 是正确的,因为如果我使用以下代码:

QPixmap pixmap(200, 200);
pixmap.fill(Qt::transparent);

QPainter painter(&pixmap);
painter.setPen(QPen(Qt::NoPen));
painter.setBrush(QBrush(QColor(0, 0, 255, 125)));

painter.drawRect(QRect(10, 10, 100, 100));
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.setBrush(QBrush(QColor(0, 0, 255, 125)));
painter.drawRect(QRect(80, 80, 100, 100));

QLabel label;
label.setPixmap(pixmap);
label.show();

我确实得到了想要的效果(但没有红色背景):

enter image description here

但是,如果我将填充更改为 Qt::red,我会再次得到:

enter image description here

我在这里错过了什么?我怎样才能得到我想要的效果?实际应用是我想在 QFrame 派生类上绘制矩形,该派生类是在第三方库中实现的,我对其控制有限。

最佳答案

我发现代码存在三个问题:

  1. 第一个矩形是用 alpha 混合(Source Over 模式)绘制的,因为您是在第一次绘制调用之后设置合成模式。第二个改为使用源模式(即按原样复制源像素,不执行 alpha 混合)。
  2. Indeed Source 不执行您似乎想要的 alpha 混合。所以不要用那个!默认组合模式可以满足您的需求。
  3. 绘制两个不同的形状将在它们之间进行组合。这显然是预料之中的,因为您正在执行两次 绘制调用;第二个绘图调用会发现目的地已经被第一个调用改变了。如果你不想这样,你必须找到一种方法在一个绘制调用中绘制两个形状(例如:将它们都添加到一个 QPainterPath,然后在一个绘制调用中绘制路径),或在稍后阶段执行合成(例如:将它们绘制到不透明的 QImage 上,然后在一次绘制调用中将图像混合到目标位置)。

关于c++ - QPainter 组合在背景下无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36862413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com