Вот один из способов сделать это:
// TB.qml
MouseArea {
width: txt.contentWidth + 20
height: txt.contentHeight + 10
property alias text: txt.text
property alias color: sh.color
ShaderEffect {
id: sh
anchors.fill: parent
property color color: "red"
property var source : ShaderEffectSource {
sourceRect: Qt.rect(0, 0, sh.width, sh.height)
sourceItem: Item {
width: sh.width
height: sh.height
Text {
id: txt
anchors.centerIn: parent
font.bold: true
font.pointSize: 30
text: "test"
}
}
}
fragmentShader:
"varying highp vec2 qt_TexCoord0;
uniform highp vec4 color;
uniform sampler2D source;
void main() {
gl_FragColor = color * (1.0 - texture2D(source, qt_TexCoord0).w);
}"
}
}
Использование его:
TB {
text: "HELLO WORLD!!!"
color: "red"
onClicked: console.log("hi world")
}
Результат:
кнопка красного цвета, текст серый от серый фон, и он точно покажет все, что находится под кнопкой.
Очевидно, что кнопка рудиментарна, но пример outta будет достаточным, чтобы вы начали и реализовали что-то в соответствии с вашими потребностями.
Ключевым элементом здесь является пользовательский шейдер, который является очень простым: он раскрашивает каждый фрагмент и применяет маску как альфа. Очевидно, вы можете использовать ShaderEffectSource
, чтобы превратить любой элемент QML в текстуру и заменить ShaderEffectSource
на другой sampler 2D
и смешать две текстуры любым способом, вырезать с помощью альфа-канала или любого из RGB, если вы используете оттенки серого маска. И в отличие от довольно ограниченного элемента OpacityMask
, это фактически прорезает и показывает все, что находится под ним, как предполагается.
Является ли это полностью пользовательские кнопки управления? Или вы используете Qt Quick Controls или аналогичные? – peppe
Qt Quick Controls 1 или 2? – GrecKo