qml无框窗口的阴影

Posted

技术标签:

【中文标题】qml无框窗口的阴影【英文标题】:Shadow for qml frameless windows 【发布时间】:2013-09-12 01:49:58 【问题描述】:

我有由 qml 创建的无框主窗口(我的 main.qml 文件中的 ApplicationWindow ..) 我通过QQmlApplicationEngine::load(Qt5.1 中引入的类)实例化 qml。 如果我设置Qt.FramelessWindowHint 标志,则窗口是无框的,但会丢失阴影(在 Windows 中)。 如何给我的窗口添加阴影?

我的窗口列表:

ApplicationWindow 
    id: rootWindow
    color : "#f8f8f8"
    maximumHeight: 445
    minimumHeight: 445
    minimumWidth: 730
    maximumWidth: 730
    flags  : Qt.FramelessWindowHint  |  Qt.Window

    Component.onCompleted: 
        setHeight(455)
        setWidth(740)
    

    MainObject
            id:mainObject1
            anchors.fill: parent
            height:445
            width:730
    



【问题讨论】:

Windows(TM) WM 将阴影效果应用于装饰的窗口,如果我设置 Qt.FramelessWindowHint 阴影不适用于窗口。 【参考方案1】:

解决方案是实现应用程序集成的阴影部分,这样您可以禁用 WM 装饰并且仍然有装饰,并且在不同平台之间保持一致。

在下面的例子中,窗口有一个阴影,它甚至可以动画来创建移动窗口时抬起窗口的效果。并且当窗口最大化时,边距被移除,因此阴影不再可见。

import QtQuick 2.7
import QtQuick.Controls 2.1
import QtGraphicalEffects 1.0
import QtQuick.Window 2.3

ApplicationWindow 
    id: main
    visible: true
    width: 300
    height: 200
    color: "#00000000"
    flags: Qt.FramelessWindowHint | Qt.Window

    Rectangle 
      id: rect
      anchors.fill: parent
      anchors.margins: main.visibility === Window.FullScreen ? 0 : 10
      MouseArea 
        id: ma
        anchors.fill: parent
        property int dx
        property int dy
        onPressed:  dx = mouseX; dy = mouseY 
        onPositionChanged: 
          main.x += mouseX - dx
          main.y += mouseY - dy
        
        onDoubleClicked: main.visibility = main.visibility === Window.FullScreen ? Window.AutomaticVisibility : Window.FullScreen
      
    

    DropShadow 
      anchors.fill: rect
      horizontalOffset: 1
      verticalOffset: 1
      radius: ma.pressed ? 8 : 5
      samples: 10
      source: rect
      color: "black"
      Behavior on radius  PropertyAnimation  duration: 100  
    

【讨论】:

【参考方案2】:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtGraphicalEffects 1.0

ApplicationWindow
    id: window
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    flags: Qt.Window | Qt.FramelessWindowHint
    color: "#00000000"

    Rectangle 
        id: rect
        anchors.fill: parent
        anchors.margins: 10
        radius: 5
    

    DropShadow 
        anchors.fill: rect
        samples: 20
        source: rect
        color: "gray"
    

【讨论】:

【参考方案3】:

如果你指的是投影效果,那就不是这样了。

除了您刚刚使用的无框窗口标志外,我们无法控制 Qt 中的 WM 装饰。它几乎是 WM 特定的。 Windows (TM) WM 应用阴影效果来装饰窗户,但这是 Windows (TM) 的选择。另外,你刚刚暗示它不应该装饰。

【讨论】:

以上是关于qml无框窗口的阴影的主要内容,如果未能解决你的问题,请参考以下文章

为啥在调试过程中有时窗口标题为黑色和按钮无框

在 qml 中恢复最小化的无框窗口

在 qml 中拖动无框窗口“抖动”

如何更改 Qt QML Drawer 的阴影颜色(不声明自定义样式)?

VC++界面编程之--阴影窗口的实现详解

WPF窗口阴影