오늘의 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";
}
}
}
.... 여기가 내가 내가 그것을가 없거나 원하는 방식으로 작동 여부를 확인하기 위해 사용하는 내 작은 테스트 하네스 :
지금까지 내 ToggleButton의 구성 요소에 대해이 있습니다 :
// 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
}
}
당신은 "qmlscene main.qml"를 실행 한 후 ToggleButton.qml 및 main.qml (각각)에 코드를 저장하고 이것을 실행할 수 있습니다.
파란색 또는 녹색 직사각형을 클릭하면 예상대로 작동합니다. Rectangle 객체의 불린 "lighten"속성은 켜기/끄기로 전환되어 사각형이 색상을 변경하게하고 연관된 ToggleButton도 적절하게 반응합니다 ("lighten"속성이 true 일 때 빨간색으로 바뀌고 "lighten" "속성은 거짓 임).
지금까지 ToggleButton 자체를 클릭하면 바인딩이 끊어졌습니다. 즉, ToggleButton을 클릭하면 ToggleButton이 예상대로 빨간색/회색으로 바뀌지 만 사각형의 색상은 바뀌지 않습니다. 그런 다음, 사각형을 클릭해도 더 이상 ToggleButton의 상태가 변경되지 않습니다.
내 질문은 내가 올바르게 ToggleButton과 추적하는 속성 사이에 양방향 통신을하기 위해이 작업을 수행하는 트릭이 무엇입니까? (이상적인 솔루션은 main.qml에 가능한 한 적은 코드를 추가 할 것이므로이 기능을 ToggleButton.qml 안에 캡슐화하여 나머지 QML 앱에 노출되는 복잡성을 최소화하십시오.)
속성 별칭의 재미있는 사용! 나는 이런 식으로 사용 된 것을 보지 못했습니다. 지금까지 컴포넌트의 내부 속성을 API 화면에 표시하는 데 사용되는 것을 보았습니다.하지만 디자인 문제가 있습니다. ToggleButton은 이제 사용 된 범위의 항목에 의존합니다. 구성 요소 사용에서 속성 별칭을 잊어 버린 경우 QML은 부모 범위에서 해당 별칭을 찾으려고 시도합니다. 그것은 다소 놀라운 버그로 이어질 수 있습니다. 그는 대신 자신이 기대 될 것이다 단지 값을 설정, 그이 isActive 별칭 속성 자신을 추가하는 구성 요소의 사용자에 대한 힌트도 없다. –