清除QWidget的透明背景

时间:2015-06-21 10:39:13

标签: c++ qt qt5 transparency paint

我在另一个小部件的叠加层上有一个小部件。只要我不清除叠加层的背景,透明度就可以正常工作。

Overlay still transparent

但是我必须清除小部件以实现显示的"效果"。我尝试解决初始问题(背景获取默认颜色),如20848594中所述,但除了将颜色更改为黑色之外没有任何影响......

After "Clearing"

有谁知道为什么应该透明的小部件不显示底层小部件?

这里是代码:

SudokuMarkerOverlayWidget::SudokuMarkerOverlayWidget(QWidget* parent, uint const fieldSize) : QWidget(parent)
{
    // Translucent should be the correct one
    setAttribute(Qt::WA_TranslucentBackground);
    //setAttribute(Qt::WA_NoSystemBackground);
    setAttribute(Qt::WA_TransparentForMouseEvents);

    ...
}

void SudokuMarkerOverlayWidget::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    painter.setRenderHint( QPainter::Antialiasing );

    // Tried this too, no difference
    // painter.setCompositionMode(QPainter::CompositionMode_Source);
    // painter.fillRect( this->rect(), Qt::transparent );
    painter.setCompositionMode(QPainter::CompositionMode_Clear);
    painter.eraseRect( this->rect() );
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);

    ...
}

编辑: 刚刚注意到,使用CompositionMode Source代替SourceOver进行半透明绘画(在第一张图片中看到的渐变)也会导致它们呈红色到黑色渐变而不是红色到透明。

这意味着除WA_TranslucentBackgroundWA_NoSystemBackground之外的所有透明度都不起作用。

1 个答案:

答案 0 :(得分:0)

Qt中的小部件可以是'native' or 'alien' type。在一种情况下,它们是一个单独的操作系统窗口。在某些操作系统中,不支持透明窗口。

如果您追求花哨的视觉效果,可能需要考虑使用QML。这就是它的设计目标。