2016-08-05 5 views
5

나는 매일 CheckBox es의 간단한 목록을 가지고 있습니다. 그들은 마스크를 사용하는 정수인 days의 값에 따라 각각 CheckBox에 대해 1 비트를 사용합니다.Qt 5.7 QML CheckBox 속성 바인딩이 사라지는 이유는 무엇입니까?

days에 할당하면 "모두 지우기"버튼 또는 "모두 설정"버튼이 모두 작동하여 업데이트됩니다. 그러나 일단 상자 중 하나를 클릭하면 더 이상 종속 속성 days의 변경 내용에 응답하지 않습니다.

왜 이런가요? 그들은 어떻게 든 언 바운드가되고 있습니다. 그렇다면 수동으로 다시 바인딩해야합니까? 그렇다면 이유는 무엇입니까?

여기에 코드의 다음과 같습니다

import QtQuick 2.7 
import QtQuick.Controls 1.4 
import QtQuick.Layouts 1.3 

ApplicationWindow 
{ 
    visible: true 
    width: 800 
    height: 400 

    property int days: 0 

    ColumnLayout 
    { 
     Repeater 
     { 
      model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 
      CheckBox 
      { 
       text: modelData 
       checked: (days & (1<<index)) != false 
       onClicked: 
       { 
        if (checked) days |= (1<<index); 
        else days &= ~(1<<index); 
       } 

      } 
     } 

     Button 
     { 
      text: "clear all" 
      onClicked: days = 0 
     } 

     Button 
     { 
      text: "set all" 
      onClicked: days = 127 
     } 
    } 
} 

:

enter image description here

는 "모두 지우기" "모든 설정"과의 문제, 첫 번째 클릭을 재현하려면. 그런 다음 일부 확인란을 클릭하십시오. 그런 다음 "모두 설정"및 "모두 지우기"를 다시 클릭하십시오. 선택한 상자가 더 이상 영향을받지 않음을 알 수 있습니다.

감사합니다.

답변

1

수동으로 체크 박스를 클릭하면 속성이 (days & (1<<index)) != false 대신 원래 코드 true으로 다시 할당됩니다. 마찬가지로 상자를 수동으로 선택 취소하면 checked 속성이 하드 코드 된 false으로 강제 설정됩니다.

수정은 Qt.binding을 사용하여 checked 속성을 간단히 리 바인드하는 것입니다. 난 당신의 자바 스크립트를 청소하고 버그를 해결했습니다. 천만에요.

Repeater 
    { 
     model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 
     CheckBox 
     { 
      function isChecked() { 
       return ((days & (1 << index)) != 0); 
      } 

      text: modelData 
      checked: isChecked() 
      onClicked: 
      { 
       if (checked) { 
        days |= (1<<index); 
       } 
       else { 
        days &= ~(1<<index); 
       } 

       // now rebind the item's checked property 
       checked = Qt.binding(isChecked); 

      } 
     } 
    } 
+0

대단히 감사합니다. 당신의 대답은 대접입니다. 나는'days'에 할당하면'checked'의 의존성이 깨지는 것을 깨닫지 못했습니다. 설명 해줘서 고마워. –

+0

'days' **에 할당하면 ** checked 속성이 깨지지 않습니다 **. 실제 사용자가 확인란을 클릭하면 오류가 발생합니다. 이것을 이렇게 생각하십시오. 'onClicked'가 호출되기 직전에 Qt는'checked = true;'를 호출하여 조건을 오버라이드합니다. – selbie

+0

네, 맞아요. 실제 클릭에 의해 완료됩니다.명확히 해줘서 고마워. –

2

여기 OP.

셀비의 대답은 아주 정확합니다. 그러나 내가 선호하는 변형을 게시하고 싶습니다.

나는 CheckBox이 QT로 분할되었음을 확인했습니다. 이는 데이터 모델에 바인딩하기 때문입니다. 을 클릭하고 (그 밖의 요점은 무엇입니까?)을 클릭하십시오. 모델을 클릭하면 모델과의 연결이 끊어 지므로 수동으로 수정해야합니다 (Selbie의 답변 참조). 나에게 이것은 부서진 디자인이다.

내 유사 콘텐츠는 Binding을 사용하므로 클릭 할 때마다 계정을 다시 설정할 필요가 없습니다. 다른 사람의 이익을 위해이 변화를 게시

import QtQuick 2.7 
import QtQuick.Controls 1.4 
import QtQuick.Layouts 1.3 

ApplicationWindow 
{ 
    visible: true 
    width: 800 
    height: 400 

    property int days: 0 

    ColumnLayout 
    { 
     Repeater 
     { 
      model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 
      CheckBox 
      { 
       text: modelData 
       Binding on checked { value: (days & (1 << index)) != 0 } 
       onClicked: 
       { 
        if (checked) days |= (1<<index) 
        else days &= ~(1<<index) 
       } 
      } 
     } 

     Button 
     { 
      text: "clear all" 
      onClicked: days = 0 
     } 

     Button 
     { 
      text: "set all" 
      onClicked: days = 127 
     } 
    } 
} 

이 같은

.