在Repeater中为多个项目重复使用相同的InnerShadow组件

时间:2015-09-23 09:02:54

标签: qt qml qtquick2

我已经制作了自己的斜角效果,这在将图形艺术家的PDF移植到QML类似的东西时非常有用,因为Photoshop有一个斜角效果,基本上是两个InnerShadow s,一个左/上,另一个右/下。

看起来像这样:

import QtQuick 2.5
import QtGraphicalEffects 1.0

Item {
    id: root

    property var source: null

    property color topColor: "white"
    property color bottomColor: "black"

    property real radius: 1
    property real spread: 0.1
    property real thickness: 1

    InnerShadow {
        id: bevelTop

        cached: true

        source: root.source
        anchors.fill: parent

        radius: root.radius
        samples: root.radius * 2
        spread: root.spread

        horizontalOffset: root.thickness
        verticalOffset: root.thickness

        color: root.topColor

        visible: false
    }

    InnerShadow {
        id: bevelBottom

        cached: true

        source: bevelTop
        anchors.fill: source

        radius: root.radius
        samples: root.radius * 2
        spread: root.spread

        horizontalOffset: -root.thickness
        verticalOffset: -root.thickness

        color: root.bottomColor
    }
}

样本用法:

Item {
    id: containerNormal

    anchors.fill: parent

    Rectangle {
        id: rectangleNormal

        anchors.fill: parent

        gradient: root.normalGradient

        radius: root.radius

        visible: false
    }

    Bevel {
        id: bevelNormal

        anchors.fill: parent

        source: rectangleNormal

        topColor: "#88ffffff"
        bottomColor: "#88000000"

        opacity: 0.5
    }
}

......它看起来很棒!唯一的问题是 - 它杀死性能,因为我在我的应用程序中的任何地方使用它,有时在Repeater中使用50-100个元素。

问题是,尽管有Bevel,但每个元素的计算结果完全相同cached: true - 我的应用程序花费大约98%的时间计算InnerShadow秒。

所以我的问题是,是否有可能利用某种类型的池,其中Qt只需要计算一次,只要它应用的Component具有相同的边界? / p>

谢谢。

0 个答案:

没有答案