Qt - 在Windows中绘制一个完全透明的窗口,而不使用WA_TranslucentBackground

时间:2016-01-11 04:48:24

标签: c++ qt transparent qwidget qframe

我需要绘制透明窗口(QLabelQFrameQWidget),但不使用WA_TranslucentBackground。原因是窗口将包含通过OpenGL呈现的其他子窗口小部件,并且使用该属性使这些窗口在Windows上不可见,如文档here所示。这在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呈现的小部件的透明部分点击背景。只要它是透明的,它就可以了,它不需要点击&#39;通过&#39;。

3 个答案:

答案 0 :(得分:1)

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

  

要解决此问题,您可以使用Qt进行渲染   一切而不是OpenGL,或者你可以将OpenGL渲染成像素图   并将其绘制到您的小部件上。

答案 1 :(得分:1)

通过启用窗口后模糊处理并将窗口属性设置为 WA_TranslucentBackground

,可以实现

透明性

setStyleSheet("background:transparent");

必需,cpp包括: include ,项目文件包括: QT + = winextras

enter image description here

enableBlurBehindWindow()方法有两个重载,您可以在this文档中查看

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

server.getPrimaryService('battery_service')

答案 2 :(得分:0)

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

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

如果将不透明度设置为零,它应该有效。 我将它与Windows标志“framelessWindow”和“Tool”结合使用,以使屏幕背景变暗。