顶圆透明window
Top round transparent window
我目前正在学习QML,我想创建一个顶层透明window。
我构建了看起来像那样的东西,但由于多种原因它似乎是错误的。
这是我的代码:
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);
主要问题是背景不透明
我认为是因为 'round' 矩形已完全绘制!?
我尝试了多个标记(Qt.Tool、Qt.Transparent、...),但 none 有效。
我想知道我是否开始做我想做的事(我想我没有),最好的方法是什么。
我看到了 qml 项目的剪辑 属性,但我也看到了性能问题。我不知道使用 属性.
是否是个好主意
我 运行 在 Qt 5.10 和 Win7 上使用 MSVC 作为编译器。
谢谢
编辑:为 window
添加透明背景颜色
添加一个答案,这样我就可以post一张图片向您证明您只需要设置颜色即可:
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()
正在为你打破它。
我想通了。
在网上更深入地搜索并感谢@dtech,我发现了这个article
这和我的问题一模一样。但是如果没有@dtech,我永远不会想到显卡问题,这让我想到了这个解决方案。
您似乎需要在 windows 上启用 aero 模式才能在 Qt 上使用透明度。
我激活了航空模式,然后重试了给定的解决方案(@dtech 的解决方案),效果非常好。
编辑:这是 Qt
上众所周知的 "bug"
现在我有了解决方案,看起来很明显,但我以前没有考虑过。
谢谢大家
我目前正在学习QML,我想创建一个顶层透明window。
我构建了看起来像那样的东西,但由于多种原因它似乎是错误的。
这是我的代码:
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);
主要问题是背景不透明
我认为是因为 'round' 矩形已完全绘制!?
我尝试了多个标记(Qt.Tool、Qt.Transparent、...),但 none 有效。
我想知道我是否开始做我想做的事(我想我没有),最好的方法是什么。
我看到了 qml 项目的剪辑 属性,但我也看到了性能问题。我不知道使用 属性.
是否是个好主意我 运行 在 Qt 5.10 和 Win7 上使用 MSVC 作为编译器。
谢谢
编辑:为 window
添加透明背景颜色添加一个答案,这样我就可以post一张图片向您证明您只需要设置颜色即可:
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()
正在为你打破它。
我想通了。
在网上更深入地搜索并感谢@dtech,我发现了这个article
这和我的问题一模一样。但是如果没有@dtech,我永远不会想到显卡问题,这让我想到了这个解决方案。
您似乎需要在 windows 上启用 aero 模式才能在 Qt 上使用透明度。
我激活了航空模式,然后重试了给定的解决方案(@dtech 的解决方案),效果非常好。
编辑:这是 Qt
上众所周知的 "bug"现在我有了解决方案,看起来很明显,但我以前没有考虑过。
谢谢大家