如何使“真正透明”的窗口成为光标,最好是在纯 QML 上? (Qt 5.7)
Posted
技术标签:
【中文标题】如何使“真正透明”的窗口成为光标,最好是在纯 QML 上? (Qt 5.7)【英文标题】:How to make a "True Transparent" window to cursor, preferably on a pure QML? (Qt 5.7) 【发布时间】:2016-11-27 20:38:17 【问题描述】:"True Transparency" explanation (image, 76kb).
在该图像ApplicationWindow 上有一个视觉透明层。但实际上,光标并没有转到 ApplicationWindow 后面的窗口(本例中为 QT Creator)。
如果添加(取消注释)“Qt.WindowTransparentForInput”标志,则实现“真正的透明度”,但按钮不再可用(这很明显,我知道)。
我尝试了各种具有相似含义的标志(来自文档),但没有找到有效的组合 - 光标在窗口边界内时保持“默认”状态(必须处于“文本”状态,因为那是它下面的文字)。
是否有人遇到过类似的问题,您是否找到了解决方案?谢谢!
图像中的代码,其他项目文件保持不变(Qt Quick Controls 2 应用程序):
import QtQuick 2.7
import QtQuick.Controls 1.5
ApplicationWindow
visible: true
width: 320
height: 240
x: 400
y: 210
color: "transparent"
flags: Qt.Widget | Qt.FramelessWindowHint //| Qt.WindowTransparentForInput
//| Qt.WA_TranslucentBackground //| Qt.WA_NoSystemBackground
//| Qt.WA_NoBackground //| Qt.WA_MouseNoMask
Button
x: ApplicationWindow.width - width
text: "Right Top Window Corner"
Button
y: ApplicationWindow.height - height
text: "Left Bottom Window Corner"
【问题讨论】:
我认为您将不得不使用操作系统 API 来实现这一点。 也许可以通过其他方式完成。您要归档的真正目标是什么? 不确定是否/如何在qml
中执行您想要的操作,但在c++
代码中我认为QWidget::setMask
可能是您正在寻找的。span>
ddriver:如果我没记错的话,这些标志来自 OS API。 folibis:是的,可以。真正的目标 - 能够在第一次单击(或按钮,或窗口中的空白区域,或窗口外)时关闭的弹出菜单。逻辑:如果不集中 - 隐藏,如果按下按钮 - 隐藏。只需添加“如果单击空白区域 - 隐藏”即可解决该问题,但我会尝试找到最佳方法。 G.M.:据我所知,QWidget::setMask 方法更复杂,涉及图像处理(我可能错了)。
ddriver:意味着这些标志对于所有受支持的操作系统 API 来说更通用。
【参考方案1】:
一种解决方案是创建 3 个窗口,一个用于透明区域,一个用于每个按钮。
import QtQuick 2.4
import QtQuick.Controls 1.5
import QtQuick.Window 2.0
ApplicationWindow
id: app
visible: true
width: 320
height: 240
x: 400
y: 210
color: "transparent"
flags: Qt.Widget | Qt.FramelessWindowHint | Qt.WindowTransparentForInput | Qt.WindowStaysOnTopHint
Window
visible: true
flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint
x: app.width - width
height: rightButton.implicitHeight
Button
id: rightButton
text: "Right Top Window Corner"
Window
visible: true
flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint
y: app.height - height
height: leftButton.implicitHeight
Button
id: leftButton
text: "Left Bottom Window Corner"
【讨论】:
您的解决方案是有效的,并推动了我前进。但是当按钮可能很多时创建不同的窗口..(计划动态创建控件)。我会等待,如果没有更好的选择 - 我会提到该问题已解决。非常感谢!以上是关于如何使“真正透明”的窗口成为光标,最好是在纯 QML 上? (Qt 5.7)的主要内容,如果未能解决你的问题,请参考以下文章