Qt让QWidget反射光线

时间:2015-04-01 19:54:26

标签: c++ qt

我正在使用Qt 4.6创建一个金色斑块网格。我使用QLabel作为我的小部件并将其父级设置为QPixmap,其中包含斑块的.jpg图像。然后小部件向上滚动屏幕。然而,现在我希望斑块在移动时发光。我认为QGraphicsEffect会有一个能够做到这一点的功能 - 就像它的dropShadowEffect,其中阴影改变了相对于光源的位置。以类似的方式,我正在寻找一种方法,当小部件移动时,每个牌匾的光泽会从光源反射出来。

所以,例如,这里有一个奖杯闪闪发光的金Gold Trophy2nd Gold Trophy的例子(看看第二个上面的奖杯)。我希望能够为我的斑块添加相同的功能。任何帮助都会受到很大的影响

1 个答案:

答案 0 :(得分:2)

这不是真正的反映,实现起来本身就很复杂。

这是一种笨拙的伪造,基本上你有一个从透明到白色到透明的动画线性渐变,当它穿过它时应该被应用的对象的alpha掩盖。

如果您正在寻找一种在Qt中实现这一目标的方法,那绝对不是QtWdigets,那将是非常低效的。正确的工具是QML - 这是多么容易:

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.2
import QtGraphicalEffects 1.0

ApplicationWindow {
    id: main
    width: 200
    height: 200
    visible: true
    color: "black"

    Grid {
        x: 15
        y: 15
        id: grid
        rows: 3
        columns: 3
        spacing: 10

        Repeater {
            model: 9
            Rectangle {
                radius: 10
                width: 50
                height: 50
                color: "gold"
                border.color: "orange"
                border.width: 5
            }
        }
    }

    LinearGradient {
        id: effect
        anchors.fill: grid
        source: grid
        rotation: -90
        property real p : pos.mouseX / pos.width
        gradient: Gradient {
            GradientStop { position: effect.p - 0.05; color: "#00FFFFFF"}
            GradientStop { position: effect.p; color: "#FFFFFFFF"}
            GradientStop { position: effect.p + 0.05; color: "#00FFFFFF"}
        }
    }

    MouseArea {
        id: pos
        anchors.fill: grid
        hoverEnabled: true
    }
}

结果:

enter image description here

此示例中的灯光将随鼠标位置移动。