如何使“真正透明”的窗口成为光标,最好是在纯 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)的主要内容,如果未能解决你的问题,请参考以下文章

CSS:如何使光标成为输入文件上的指针?

MFC如何知道光标在那个控件上 用哪个函数?谢谢

如何在QML文件里,以模态的方式打开别一个QM

如何使 QLineEdit 跟随光标向我显示它的坐标

如何使用 gtkmm 抓取和隐藏光标?

当用户将鼠标悬停在滑块上时,使光标成为手