今日のQML/QtQuickは、指定されたブール値のQMLプロパティの状態を監視するためにインスタンス化できる小さなトグルボタンウィジェットを作成することです。 ToggleButtonをクリックすると、そのプロパティの状態です。ブール値のプロパティを追跡/制御するQMLトグルボタンを作成する方法
これまでのところ、私は私のトグルボタンコンポーネントのためにこれを持っている:
// Contents of ToggleButton.qml
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4
Button {
property bool isActive: false
onClicked: {
isActive = !isActive;
}
style: ButtonStyle {
background: Rectangle {
border.width: control.activeFocus ? 2 : 1
border.color: "black"
radius: 4
color: isActive ? "red" : "gray";
}
}
}
....そしてここで私はそれが私はそれがない、または望むように動作するかどうかを確認するために使用私の小さなテストハーネスです。
// Contents of main.qml
import QtQuick 2.6
import QtQuick.Window 2.2
Window {
visible: true
width: 360
height: 360
Rectangle {
property bool lighten: false;
id:blueRect
x: 32; y:32; width:64; height:64
color: lighten ? "lightBlue" : "blue";
MouseArea {
anchors.fill: parent
onClicked: parent.lighten = !parent.lighten;
}
}
Rectangle {
property bool lighten: false;
id:greenRect
x:192; y:32; width:64; height:64
color: lighten ? "lightGreen" : "green";
MouseArea {
anchors.fill: parent
onClicked: parent.lighten = !parent.lighten;
}
}
ToggleButton {
x:32; y:128
text: "Bright Blue Rect"
isActive: blueRect.lighten
}
ToggleButton {
x:192; y:128
text: "Bright Green Rect"
isActive: greenRect.lighten
}
}
あなたは(それぞれ)ToggleButton.qmlにコードとmain.qmlを保存することで、これを実行し、「qmlsceneのmain.qml」を実行することができます。
青色または緑色の四角形をクリックすると、期待どおりに機能することに注意してください。 Rectangleオブジェクトのブール値「lighten」プロパティがオンとオフに切り替えられ、Rectangleの色が変更され、関連付けられたToggleButtonも適切に反応します(「lighten」プロパティがtrueのときは赤、 "プロパティはfalseです)。
これまでのところ、ToggleButton自体をクリックすると、バインディングが壊れています。つまり、ToggleButtonをクリックするとToggleButtonが赤/グレーになりますが、矩形の色は変わりませんそれに続いて、矩形をクリックしてもToggleButtonの状態が変更されなくなりました。
私の質問は、ToggleButtonとそれが追跡しているプロパティとの間に常に双方向の対応関係があるように、これを正しく行うことです。 (QMLアプリケーションの残りの部分にさらされる複雑さを最小限に抑えるために、この機能をToggleButton.qml内にカプセル化したいので、理想的なソリューションはmain.qmlに可能な限り少ないコードを追加することに注意してください)
興味深い使用ここでは期待どおりに動作QMLコードの更新バージョンです!私はこれの前に使用されていることを見ていませんでした。これまでは、コンポーネントの内部プロパティをAPIサーフェスに公開するのに使用されていました。しかし、設計上の問題があります:あなたのToggleButtonは、現在使用されているスコープのものに依存しています。コンポーネント使用時にプロパティエイリアスを忘れた場合、QMLは親スコープ内でそのエイリアスを検索しようとします。それはかなり驚くべきバグにつながる可能性があります。コンポーネントのユーザーにとって、isActiveエイリアスプロパティを追加しなければならないというヒントも、期待する値を設定するのではなく、自分自身で追加する必要はありません。 –