このモジュールのおかげで、組み込みの公式ソリューションが Qt 5 の時点で存在しQtGraphicalEffects
ますが、誰もそのような単純なソリューションを提供していないことに非常に驚いています。Qt 6.x をターゲットにしている場合QtGraphicalEffects
は、残念ながら非推奨です。回答の 2 番目の部分にジャンプして、QtGraphicalEffects
.
QtGraphicalEffects
解決
他の効果の中にOpacityMask
は、この目的のために悪用されるタイプがあります。アイデアは、正しく設定されImage
た でソースをマスクすることです。レイヤリングを使用した最も単純な例を次に示します。Rectangle
radius
Image {
id: img
property bool rounded: true
property bool adapt: true
layer.enabled: rounded
layer.effect: OpacityMask {
maskSource: Item {
width: img.width
height: img.height
Rectangle {
anchors.centerIn: parent
width: img.adapt ? img.width : Math.min(img.width, img.height)
height: img.adapt ? img.height : width
radius: Math.min(width, height)
}
}
}
}
adapt
この最小限のコードは、正方形の画像に対して適切な結果を生成しますが、変数を介して非正方形の画像も考慮に入れます。生成されたマスクにフラグを設定するfalse
と、画像サイズに関係なく、常に円になります。Item
これは、ソースを満たし、実際のマスク (内側Rectangle
) のサイズを指定できるようにする外部の使用により可能です。アスペクト比に関係なく、ソースを埋めるマスクを目指すだけで、明らかに外部を取り除くことができItem
ます。
これは、正方形フォーマット (左)、非正方形フォーマットadapt: true
(中央)、最後に非正方形フォーマットadapt: false
(右)のかわいい猫の画像です。

このソリューションの実装の詳細は、他の素晴らしい回答のシェーダーベースの回答と非常によく似ています(cfr。そのための QML ソースコードはここOpacityMask
にあります-効果をフィードするために整形式を返すだけです)。SourceProxy
ShaderEffectSource
非依存ソリューション
モジュールに依存したくない (または依存できない) 場合は (つまり、実際の存在に依存します)、シェーダーを使用して効果を再実装できます。既に提供されているソリューションとは別に、別のアプローチは、および関数を使用することです。コードは次のとおりです。QtGraphicalEffects
OpacityMask.qml
step
smoothstep
fwidth
import QtQuick 2.5
Image {
id: image
property bool rounded: true
property bool adapt: true
layer.enabled: rounded
layer.effect: ShaderEffect {
property real adjustX: image.adapt ? Math.max(width / height, 1) : 1
property real adjustY: image.adapt ? Math.max(1 / (width / height), 1) : 1
fragmentShader: "
#ifdef GL_ES
precision lowp float;
#endif // GL_ES
varying highp vec2 qt_TexCoord0;
uniform highp float qt_Opacity;
uniform lowp sampler2D source;
uniform lowp float adjustX;
uniform lowp float adjustY;
void main(void) {
lowp float x, y;
x = (qt_TexCoord0.x - 0.5) * adjustX;
y = (qt_TexCoord0.y - 0.5) * adjustY;
float delta = adjustX != 1.0 ? fwidth(y) / 2.0 : fwidth(x) / 2.0;
gl_FragColor = texture2D(source, qt_TexCoord0).rgba
* step(x * x + y * y, 0.25)
* smoothstep((x * x + y * y) , 0.25 + delta, 0.25)
* qt_Opacity;
}"
}
}

最初のアプローチと同様に、rounded
上記adapt
で説明したように、効果の視覚的な外観を制御するためにプロパティが追加されます。