顶部圆形透明窗

时间:2018-10-11 07:52:39

标签: qt window qml transparency

我目前正在学习QML,我想创建一个顶部圆形的透明窗口。

我已经构建了类似的东西,但是出于多种原因,这似乎是错误的。

这是我的代码:

Window {
    id: app
    visible: true
    width: 70
    height: 70

    flags: Qt.Window | Qt.FramelessWindowHint | Qt.WA_TranslucentBackground

    Rectangle {

        anchors.fill: parent
        radius: parent.width / 2.0

        color: "black"

        MouseArea {
            property point clickPos: "1,1"

            anchors.fill: parent
            drag.target: parent

            onPressed: {
                clickPos  = Qt.point(mouse.x,mouse.y)
            }

            onPositionChanged: {
                var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
                app.x += delta.x;
                app.y += delta.y;
            }

            onDoubleClicked: app.close()
        }
    }
}

在主目录中使用这些标志:

QQuickWindow::setDefaultAlphaBuffer(true);

QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

主要问题是背景不透明。

Seems fine

Not fine

我认为是因为“圆形”矩形已完全绘制!!

我尝试了多个标志(Qt.Tool,Qt.Transparent等),但没有一个起作用。

我想知道我是否可以很好地开始做自己想做的事情(我想我不想做),什么是最好的做事方法。

我已经看到了qml项目的clipping属性,但是我也看到了性能问题。我不知道使用该属性是否是个好主意。

我正在使用MSVC作为编译器的Qt 5.10和Win7上运行。

谢谢

编辑:在窗口中添加透明背景色

BackgroundColorWindow

2 个答案:

答案 0 :(得分:4)

添加一个答案,这样我就可以发布图像向您证明,您所需要做的就是设置颜色:

Window {
    id: app
    visible: true
    width: 70
    height: 70

    flags: Qt.Window | Qt.FramelessWindowHint

    color: "#00000000"

    Rectangle {

        anchors.fill: parent
        radius: parent.width / 2.0

        color: ma.pressed ? "red" : "black"

        MouseArea {
            id: ma
            property point clickPos: "1,1"

            anchors.fill: parent
            drag.target: parent

            onPressed: {
                clickPos  = Qt.point(mouse.x,mouse.y)
            }

            onPositionChanged: {
                var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
                app.x += delta.x;
                app.y += delta.y;
            }

            onDoubleClicked: app.close()
        }
    }
}

结果:

enter image description here

我没有使用您在C ++中设置的任何标志,也许setDefaultAlphaBuffer()正在为您破坏它。

答案 1 :(得分:1)

我知道了。

在网上和@dtech上进行了更深入的搜索后,我发现了这个article

这是和我完全一样的问题。但是,如果没有@dtech,我将永远不会想到显卡问题,这导致我找到了这种解决方案。

似乎您需要在Windows上启用 aero 模式,以便能够在Qt上使用透明度。

我激活了航空模式,然后重试了给定的解决方案(@dtech的解决方案),它非常好用。

编辑:这是Qt上的众所周知的“错误”

现在我有了解决方案,这似乎很明显,但是我之前从未考虑过。

谢谢大家