C++ 清除QWidget的透明背景

C++ 清除QWidget的透明背景,c++,qt,qt5,transparency,paint,C++,Qt,Qt5,Transparency,Paint,我有一个小部件作为另一个小部件的覆盖。只要我不清除覆盖层的背景,透明度就可以正常工作 但是我必须清除这个小部件来激活显示的“效果”。我试图解决初始问题(背景获得默认颜色),如中所述,但除了将颜色更改为黑色外,没有任何效果 有人知道为什么应该是透明的小部件不显示基线小部件吗 代码如下: SudokuMarkerOverlayWidget::SudokuMarkerOverlayWidget(QWidget* parent, uint const fieldSize) : QWidget(pa

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

但是我必须清除这个小部件来激活显示的“效果”。我试图解决初始问题(背景获得默认颜色),如中所述,但除了将颜色更改为黑色外,没有任何效果

有人知道为什么应该是透明的小部件不显示基线小部件吗


代码如下:

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(在第一幅图像中看到的渐变),也会使它们成为红色到黑色的渐变,而不是红色到透明


这意味着除了最初的半透明背景和NoSystemBackground之外的所有透明度都不起作用。在一种情况下,它们是一个单独的操作系统窗口。在某些操作系统中,不支持透明窗口


你可能想考虑使用QML,如果你想要的是视觉效果。这就是它的设计目的。

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


你可能想考虑使用QML,如果你想要的是视觉效果。这就是它的设计目的。

您是否尝试用**透明画笔**明确清除旧矩形,而不是将其擦除(就像您在回答问题时所说的那样)?是的,使用合成模式源代码-与使用合成模式源代码没有区别您是否尝试使用**透明笔刷**显式清除旧矩形,而不是将其擦除(如您向我们展示的问题的答案中所述)?是的,使用合成模式源代码-与使用合成模式源代码没有区别,你可能有一点,但仍然有工作透明度,只是清理不工作,我最后的评论似乎更糟糕,那么我的意思是,当然,如果我不使这项工作没有太多的费用,我会考虑使用替代它可能只是简单的指定一个窗口标志在您的构造函数。我花了相当多的时间在windows上实现透明,但它不是很健壮。不担心。好吧,你可能有一点,但仍然有工作透明度,只是清理不工作,我最后的评论似乎更糟糕,那么我的意思是,当然,如果我不让这个工作没有太多的费用,我会考虑使用替代它可能只是简单的指定你的构造器上的窗口标志。我花了相当多的时间在windows上实现透明,但它不是很健壮。别担心。