【问题标题】:Top round transparent window顶部圆形透明窗
【发布时间】:2018-10-11 07:52:39
【问题描述】:

我目前正在学习 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()
        }
    }
}

在 main 中使用这些标志:

QQuickWindow::setDefaultAlphaBuffer(true);

QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

主要问题是背景不透明。

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

我尝试了多个标志(Qt.Tool、Qt.Transparent、...),但没有一个有效。

我想知道我是否开始做我想做的事(我想我没有),最好的方法是什么。

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

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

谢谢

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

【问题讨论】:

  • 我不能打招呼,不知道为什么...所以我在这里说。大家好
  • 您是否尝试将窗口颜色设置为透明?
  • 是的,我做到了。但是,正方形填满了整个窗口,不再是圆形了
  • 窗户永远不是圆的。你充其量只能制造一种错觉。将color 设置为Window,而不是矩形...
  • @Felix 仅仅因为它与 window 无关并不意味着它不会有任何效果。只是不是想要的效果,因为它仍然只是一个数值并且仍在设置中,因为 Qt 没有任何保护措施来防止设置不相关的标志。

标签: qt window qml transparency


【解决方案1】:

添加一个答案,以便我可以发布一张图片向您证明您所需要的只是设置颜色:

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()
        }
    }
}

结果:

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

【讨论】:

  • 复制/粘贴您的代码并没有给我与您相同的输出。我的红色 cricle 周围仍然有黑色矩形。这很奇怪,我试图删除我的两个 C++ 设置,但它仍然是一样的。你能发布你的 main.cpp 吗???
  • 它是标准自动生成的 main.cpp,用于新的空白项目。也许你的项目没有重建。尝试全部清理/运行 qmake/全部重建。
  • 完成。没有改变。我有自动生成的 QtQuickApplication 主程序(空的)。和你一样吗?这是我所拥有的链接:Output
  • 好吧,在这种情况下,它可能是一些错误。我在带有 mingw 的 Windows 7 上使用 Qt 5.11,但我已经在以前版本的 Qt 中使用了透明窗口,没有问题。而且我怀疑编译器会有所作为。所以这可能是一个外部问题,比如与显卡驱动程序不兼容。
  • 好吧,这很奇怪。我要在家里做一些测试,看看是否有任何变化。谢谢
【解决方案2】:

我想通了。

在网上更深入地搜索并感谢@dtech,我发现了这个article

这与我的问题完全相同。但如果没有@dtech,我永远不会想到显卡问题,这导致我找到了这个解决方案。

看来您需要在 Windows 上启用 aero 模式才能在 Qt 上使用透明度。

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

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

现在我有了解决方案,看起来很明显,但我之前没有考虑过。

谢谢大家

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 2021-06-10
    • 2021-03-08
    • 1970-01-01
    • 2010-10-07
    • 2019-02-14
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多