如何在QtQuick 2.0上为Rectangle
视觉项目绘制投影?
我喜欢为我的主窗口画一个阴影(我有一个透明且没有装饰的窗口)
答案 0 :(得分:16)
作为剪切阴影问题的解决方法,您可以将Rectangle
放在Item
中,使用额外的边距来计算帐户中的模糊半径,并在该容器上应用阴影:
import QtQuick 2.0
import QtGraphicalEffects 1.0
Item {
width: 320
height: 240
Item {
id: container
anchors.centerIn: parent
width: rect.width + (2 * rectShadow.radius)
height: rect.height + (2 * rectShadow.radius)
visible: false
Rectangle {
id: rect
width: 100
height: 50
color: "orange"
radius: 7
antialiasing: true
border {
width: 2
color: "red"
}
anchors.centerIn: parent
}
}
DropShadow {
id: rectShadow
anchors.fill: source
cached: true
horizontalOffset: 3
verticalOffset: 3
radius: 8.0
samples: 16
color: "#80000000"
smooth: true
source: container
}
}
答案 1 :(得分:6)
只需使用DropShadow
模块中的QtGraphicalEffects
。
一个完整的,有效的例子:
import QtQuick 2.0
import QtGraphicalEffects 1.0
Rectangle {
width: 640
height: 480
color: "blue"
Rectangle {
id: rect
anchors.centerIn: parent
width: 100
height: 100
color: "red"
}
DropShadow {
anchors.fill: rect
cached: true
horizontalOffset: 3
verticalOffset: 3
radius: 8.0
samples: 16
color: "#80000000"
source: rect
}
}
请注意,您会看到许多类似的警告:
文件:///opt/Qt5.0.1/5.0.1/gcc_64/qml/QtGraphicalEffects/DropShadow.qml:391:5: QML SourceProxy:为属性“输出”检测到绑定循环 文件:///opt/Qt5.0.1/5.0.1/gcc_64/qml/QtGraphicalEffects/private/GaussianDirectionalBlur.qml:66:5: QML SourceProxy:为属性“输出”检测到绑定循环 文件:///opt/Qt5.0.1/5.0.1/gcc_64/qml/QtGraphicalEffects/private/GaussianDirectionalBlur.qml:61:5: QML SourceProxy:为属性“输出”检测到绑定循环 文件:///opt/Qt5.0.1/5.0.1/gcc_64/qml/QtGraphicalEffects/private/GaussianDirectionalBlur.qml:66:5: QML SourceProxy:为属性“输出”检测到绑定循环 文件:///opt/Qt5.0.1/5.0.1/gcc_64/qml/QtGraphicalEffects/private/GaussianDirectionalBlur.qml:61:5: QML SourceProxy:为属性“输出”检测到绑定循环 file:///opt/Qt5.0.1/5.0.1/gcc_64/qml/QtGraphicalEffects/private/GaussianGlow.qml:53:5:QML SourceProxy:为属性“output”检测到绑定循环
这些警告是QTBUG-28521,已在Qt 5.0.2(在撰写本文时尚未发布)中修复。幸运的是,除了烦人的控制台输出外,没有实际问题。
答案 2 :(得分:4)
有趣的问题......我一直在寻找更好的方法来做到这一点。这是我暂时为QML矩形完成投影效果的快速而肮脏的方法。
Rectangle{
width: 500
height: 500
color: "dark grey"
Rectangle {
id: backgroundRect
width: 200
height: 150
radius: 5
anchors.centerIn: parent
color: "red"
Rectangle {
id: dropShadowRect
property real offset: Math.min(parent.width*0.025, parent.height*0.025)
color: "purple"
width: parent.width
height: parent.height
z: -1
opacity: 0.75
radius: backgroundRect.radius + 2
anchors.left: parent.left
anchors.leftMargin: -offset
anchors.top: parent.top
anchors.topMargin: offset
}
}
}
答案 3 :(得分:0)
我尝试了上面的代码并且它实际上添加了一个阴影,虽然在我的情况下只是在偏移上添加另一个矩形,但我给了我更多的效果。
Rectangle{
id: rec_Shadow
height:rect_withShadow.height
width: rect_withShadow.width
border.color: "#B3B3B3"
color: "#C5C5C5"
anchors{
verticalCenter: rect_withShadow.verticalCenter
horizontalCenter: rect_withShadow.horizontalCenter
horizontalCenterOffset: 5
verticalCenterOffset: 5
}
radius: rect_withShadow.radius
}
接下来,添加您想要阴影的矩形,并将其称为rect_withShadow