Je suis relativement nouveau à QML et j'essaye de faire un QML Button
changer son arrière-plan quand un événement se produit. Le Button
utilise style: ButtonStyle
et un Canvas
pour générer des graphiques (via JavaScript). J'utilise QML State
s pour contrôler l'état Button
.QT Le signal QML n'atteint pas un Canvas lorsqu'il est défini dans le style: ButtonStyle
je me suis dit que la Canvas
ne rafraîchit pas automatiquement alors j'ai essayé d'appeler requestPaint()
dans le gestionnaire onStateChanged
, mais ce signal ne pas obtenir en quelque sorte à la toile lorsqu'elle est définie dans la propriété style
.
Voici mon code:
Button {
id: small_rounded_button
state: "OFF"
states: [
State {
name: "ON"
PropertyChanges {
target: small_rounded_button
backgroundColor: "#18243C"
}
},
State {
name: "OFF"
PropertyChanges {
target: small_rounded_button
backgroundColor: "#aaa"
}
}
]
MouseArea {
anchors.fill: parent
onClicked: {
if (small_rounded_button.enabled == true)
{
if (small_rounded_button.state == "ON")
{
small_rounded_button.state = "OFF"
}
else
{
small_rounded_button.state = "ON"
}
}
}
}
style: ButtonStyle {
background: Item {
Canvas {
anchors.fill: parent
onPaint: {
var ctx = getContext("2d");
ctx.reset();
ctx.beginPath();
ctx.lineWidth = height * 0.1;
ctx.roundedRect(ctx.lineWidth/2, ctx.lineWidth/2,
width - ctx.lineWidth, height - ctx.lineWidth, small_rounded_button.radius, small_rounded_button.radius);
ctx.strokeStyle = "grey";
ctx.stroke();
/* this definitely sets the colour when app starts */
ctx.fillStyle = small_rounded_button.backgroundColor;
ctx.fill();
}
/* This never happens */
onStateChanged: {
requestPaint()
}
}
Label {
text: small_rounded_button.text
color: "#000"
font.pixelSize: small_rounded_button.height * 0.5
//anchors.centerIn: parent
}
label: null
}
}
}
Merci à l'avance pour toute aide,
Greg
Grande réponse! Merci beaucoup! – radaudio
Merci pour ça. J'ai une question de suivi; J'essaie de faire quelque chose de similaire avec un curseur. Lorsque la valeur du curseur change, je souhaite que le canevas soit redessiné. J'ai essayé de donner un ID au canvas et d'appeler des événements redessinés à partir de la méthode onValueChanged, mais comme BaCaRoZzo, je n'ai pas réussi à faire marcher ça. J'ai donc essayé de trouver comment connecter la toile au curseur, de la même façon que ce que vous avez en tant que solution, mais je ne trouve pas la méthode de fixation du curseur. As tu des idées? – admiral142