2016-08-05 20 views
5

私はCheckBoxの単純なリストを1週間に1つずつ持っています。それらは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に再割り当てされます。同様に、ボックスを手動でオフにすると、checkedプロパティが強制的にハードコードされたfalseになります。

修正は、Qt.bindingを使用してcheckedプロパティを単に再バインドすることです。私はあなたのjavascriptをきれいにして、あなたのバグを修正しました。どういたしまして。

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' **に割り当てられても**チェックされたプロパティが壊れません。実際のユーザーがチェックボックスをクリックすると、そのチェックボックスが壊れます。それをこのように考えてください。 'onClicked'が呼び出される直前に、Qtは' checked = true; 'を呼び出して、あなたの条件をオーバーライドします。 – selbie

+0

はい、もちろんそうです。それは実際のクリックによって行われます。明確化のためにありがとう。 –

2

ここです。

セルビーの答えはかなり正しいです。しかし、私は好きなバリエーションを投稿したいと思います。

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 
     } 
    } 
} 

:このような

関連する問題