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 位。

PS - 它不需要像半透明窗口那样表现,即可以通过渲染的小部件的透明部分单击背景WA_TranslucentBackground。在这里,只要它是透明的就可以了,它不需要“通过”点击。

4

3 回答 3

3

我在 Windows (Qt 5) 上并使用以下内容创建半透明小部件:

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

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

于 2016-01-11T06:51:25.927 回答
1

透明度可以通过在窗口后面启用模糊并将窗口属性设置为WA_TranslucentBackground来实现

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

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

在此处输入图像描述

enableBlurBehindWindow() 方法还有两个重载,您可以查看文档中的内容

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

setStyleSheet("background:transparent");
于 2020-09-02T16:39:19.080 回答
1

不幸的是,这在 Windows 上是不可能的。您可以使用带有 alpha 通道的颜色为小部件设置透明度,如下所示setStyleSheet("background-color: rgba(255,0,0,50%);");:但是在您设置WA_TranslucentBackground. 如果没有这个标志,alpha 通道将不起作用,你会得到黑色窗口。所以唯一的解决方案是使用WA_TranslucentBackground. 然后像 Qt 文档说的那样做 OpenGL 绘画:

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

于 2016-01-14T07:49:56.953 回答