在Windows中绘制完全透明的窗口而不使用WA_TranslucentBackground,需要使用Qt。

5
我需要绘制透明窗口(使用QLabelQFrameQWidget),但是不要使用WA_TranslucentBackground。这是因为这些窗口将包含通过OpenGL渲染的其他子窗口,使用该属性会使这些窗口在Windows上变得不可见,如此处所述。尽管在Mac上可以正常工作,但我需要在Windows上使用不同的解决方案,因为它在那里无法工作。我尝试过:设置一个空的pixmap。但它仍然显示为灰色背景:
#include <QApplication>
#include <QLabel>
#include <QBitmap>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel l;
    l.setWindowFlags(Qt::FramelessWindowHint);
    QPixmap p("");
    l.setPixmap(p);
    l.setScaledContents(true);
    l.resize(300, 500); //just to test my idea
    l.setMask(p.scaled(l.width(),l.height(),Qt::IgnoreAspectRatio,
    Qt::SmoothTransformation).mask());
    l.show();
    return a.exec();
}

有没有其他方法可以在Windows上实现完全透明的窗口?平台 - Qt 5.3.1,32位。

P.S - 它不需要像半透明窗口那样行为,即背景可以通过渲染WA_TranslucentBackground的小���件的透明部分进行点击。只要它是透明的,就可以了,不需要“穿透”点击。


也许可以使用 SetWindowRgn 函数,这样父窗口区域将由子窗口矩形组成,从而创建一个看似无形的父窗口。 - Jonathan
你能否在回答中添加一个最小工作示例? - SexyBeast
我目前不在适当的编译环境附近。 但是这里有一个链接到一个CodeProject页面,该页面使用SetWindowRgn在窗口中创建孔。 http://www.codeproject.com/Articles/291/Creating-holes-in-a-window - Jonathan
3个回答

3

我正在使用Windows (Qt 5),用以下方式创建半透明小部件:

setWindowOpacity(0.6);
setStyleSheet("QWidget{background: #000000}")

如果你将不透明度设为零,它应该可以工作。 我将其与Windows标志 "framelessWindow" 和 "Tool"一起使用,以使屏幕背景变暗。

如果我将不透明度设置为零,那么所有子小部件也会变得不可见吗? - SexyBeast
抱歉,我不知道,因为在我的设置中没有任何子小部件,并且文档中也没有明确说明。 - Mailerdaimon
这仍然不起作用。背景仍然像以前一样灰色。 - SexyBeast
我刚刚尝试了一个最小的示例,并且设置WindowOpacity对我有效,但是,正如您在评论中提到的那样,所有子窗口小部件都变得半透明。如果您没有获得任何透明度,也许5.3版本出现了问题?在Qt中,透明度+OpenGL(或QML)从来不是一个容易的话题。 - Mailerdaimon
不行。抱歉。然而,在我的情况下,这不是可行的解决方案,因为子小部件也会变得不可见。 - SexyBeast
显示剩余2条评论

2

通过启用窗口模糊并将窗口的属性设置为WA_TranslucentBackground,可以实现透明效果。

  setAttribute(Qt::WA_TranslucentBackground);
    QtWin::enableBlurBehindWindow(this); 

必需项,cpp包含:include<QtWin>,项目文件包含:QT += winextras

enter image description here

方法enableBlurBehindWindow()有两个更多的重载,你可以在这里的文档中查看。

对于子窗口小部件,您可以使用:

setStyleSheet("background:transparent");

1
很遗憾,在Windows上无法实现这一点。您可以使用带有alpha通道的颜色设置小部件的透明度,如下所示:setStyleSheet("background-color: rgba(255,0,0,50%);");。但是,除非您设置WA_TranslucentBackground,否则此方法不适用于顶级小部件。如果没有这个标志,alpha通道将不起作用,并且您会得到黑色窗口。因此,唯一的解决方案是使用WA_TranslucentBackground,然后按照Qt文档中所述进行OpenGL绘图:

为了解决这个问题,您可以使用Qt来渲染所有内容而不是OpenGL,或者您可以将OpenGL渲染成一个像素图并将其绘制到您的小部件上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接