2016-08-05 53 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

當您手動單擊複選框時,checked屬性被重新分配到硬編碼true而不是原始表達式:(days & (1<<index)) != false。同樣,手動取消選中該框會強制將checked屬性硬編碼爲false

修復方法是使用Qt.binding簡單重新綁定checked屬性。我已經清理了你的javascript並修復了你的bug。不用謝。

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在這裏。

Selbie的回答是非常正確的。但我想發佈一個我更喜歡的變體。

我得出結論:CheckBox es在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 
     } 
    } 
} 

發佈這種變化爲他人謀取利益。

相關問題