2016-06-15 6 views
2

GUI의 다른 페이지에 의미가 같은 "동일한"확인란 (동일한 레이블, 동일한 효과)이되도록 두 개의 확인란을 만들고 싶습니다. (두 페이지 모두를 사용자의 편의를 위해 사용하는 것입니다.)2 개의 QML 확인란을 함께 바인딩하여 해당 상태가 항상 동일 함을 확인하십시오.

두 개의 상태가 항상 다른쪽에 반영되도록 두 개의 CheckBox QML 요소를 "바인딩"해야하며 그 반대의 경우도 마찬가지입니다.

이것은 내가 JS/JQuery 대신 QML/JS를 사용하고 있다는 것을 제외하면 equivalent to what's being asked here입니다.

// Global shared state object 
pragma Singleton 
MySharedState { 
    my_feature_on: false 
} 

을 그리고, 두 개의 별도의 페이지에 동일한 CheckBox 인스턴스 :

// Checkbox implementation (on both pages 
CheckBox { 
    checked: MySharedState.my_feature_on 
    onClicked: MySharedState.my_feature_on = checked 
} 

좀 글로벌 지속 속성에 각각의 체크 박스의 checked 상태를 바인딩의 순진 구현이 작동 것이라고 생각

그러나 확인란을 클릭하면 초기 checked 바인딩이 끊어지기 때문에이 방법은 작동하지 않습니다. 이것은 intended behavior, not a bug입니다.

두 개의 확인란이 항상 동일한 "선택 됨"상태를 공유하도록하려면 어떻게해야합니까?

EDIT : 위의 설명에 따르면 위의 구현은 Qt 5.7에서 릴리스 된 Qt Quick Controls 2에서 수정없이 작동하므로이 질문은 이전 버전의 Qt (5.6 포함)에만 적용됩니다. "장기 지원"발표). Binding 유형 바인딩 두 방법을 사용

+1

Qt Quick Controls 2에서 Qt 5.7로 출시 된 제품은 두 개의 CheckBox를 직접 또는 공유 상태 개체를 통해 바인딩 할 때 유용합니다. – jpnurmi

+0

@ J-PNurmi 굉장합니다. 질문을 편집하여이를 메모합니다. 고맙습니다. –

답변

3

확인란을 클릭하면 'checked'속성이 변경되고 원래 checked: MySharedState.my_feature_on 바인딩이 제거됩니다. 링크 된 버그 보고서의 J-P Nurmi가 설명한대로 원래 바인딩을 복원하려면 create a property binding from Javascript해야합니다.

그 때문에 Qt.binding()을 사용해야합니다.

CheckBox { 
    checked: MySharedState.my_feature_on 
    onClicked: { // the checked binding is removed since checked has been changed externally to the binding 
     MySharedState.my_feature_on = checked 
     checked = Qt.binding(function() {return MySharedState.my_feature_on}); //we restore the checked binding 
    } 
} 
+0

굉장합니다. 나는 JS 컨텍스트에서 바인딩을 명시 적으로 할당 할 수 있었는지 궁금해하고 있었지만,이 특정 인스턴스를 넘어선 꽤 유용한 트릭처럼 보였다. –

2

작동합니다

import QtQuick 2.5 
import QtQuick.Controls 1.0 

ApplicationWindow { 
    objectName: "window" 
    width: 600 
    height: 200 
    visible: true 

    Row { 
     CheckBox { 
      id: checkBox1 
      text: "Check Box 1" 
     } 

     CheckBox { 
      id: checkBox2 
      text: "Check Box 2" 
     } 
    } 

    Binding { 
     target: checkBox2 
     property: "checked" 
     value: checkBox1.checked 
    } 

    Binding { 
     target: checkBox1 
     property: "checked" 
     value: checkBox2.checked 
    } 
} 

이 바인딩 루프에 대해 불평하지 않는 이유를 잘 모르겠습니다 만.

+0

바인딩 루프에 대한 오류가 없다는 것은 이상한 일입니다. 아마도'check' 속성이 실제로 변경되지 않을 때'checked' 신호가 출력되지 않기 때문일 수 있습니다. 또 다른 이상한 점은 체크 박스가 클릭되었을 때 명시 적'Binding' 객체의 연결이 끊어지지 않는다는 것입니다. 이것은 표준'checked :'속성 할당이하는 방식입니다. 이 솔루션은 효과가있는 것처럼 보이지만 다른 하나를 사용하게 될 것입니다. 왜냐하면 그것은 제게 더 이해하기 쉽고 더 명확하게 보이기 때문입니다. –