2016-08-05 14 views
5

मेरे पास CheckBox es की एक साधारण सूची है, जो सप्ताह के प्रत्येक दिन के लिए एक है। वे days के मान पर निर्भर करते हैं, एक मुखौटा का उपयोग करने वाला एक पूर्णांक, प्रत्येक CheckBox के लिए 1 बिट।क्यूटी 5.7 क्यूएमएल क्यों मेरी चेकबॉक्स संपत्ति बाइंडिंग गायब हो रही है?

"सभी साफ़ करें" बटन या "सभी सेट करें" बटन के साथ 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 संपत्ति को बस पुनर्निर्मित करना है। मैंने आपके जावास्क्रिप्ट को साफ़ कर लिया है और अपनी बग तय कर दी है। आपका स्वागत है।

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

बहुत बहुत धन्यवाद! आपका जवाब एक इलाज करता है। मुझे एहसास नहीं हुआ था कि 'दिन' को असाइन करने से 'चेक किए गए 'की निर्भरता टूट जाएगी। स्पष्टीकरण के लिए धन्यवाद। –

+0

'दिनों' ** को असाइन करने से ** ** चेक की गई संपत्ति को तोड़ने का कारण नहीं है। चेकबॉक्स पर वास्तविक उपयोगकर्ता क्लिक करने का कारण बनता है। इसके बारे में इस तरह से सोचें। 'OnClicked' कहने से ठीक पहले, क्यूटी ने 'चेक = सत्य' का आह्वान किया; इस प्रकार आपकी सशर्त ओवरराइडिंग। – selbie

+0

हां आप बिल्कुल सही हैं। यह वास्तविक क्लिक द्वारा किया जाता है।स्पष्टीकरण देने के लिए धन्यवाद। –

2

ओपी यहां।

सेल्बी का जवाब काफी सही है। लेकिन मैं एक बदलाव पोस्ट करना चाहता हूं जिसे मैं पसंद करता हूं।

मैं इस निष्कर्ष पर आया हूं कि CheckBox es QT में टूटा हुआ है। ऐसा इसलिए है क्योंकि आप उन्हें अपने डेटा मॉडल से जोड़ना चाहते हैं। और आप उन्हें पर क्लिक करना चाहेंगे (अन्यथा बिंदु क्या है)। उन पर क्लिक करने से मॉडल से कनेक्शन टूट जाता है, ताकि इसे मैन्युअल रूप से ठीक किया जाना चाहिए (सेल्बी का जवाब देखें)। मेरे लिए यह एक टूटी हुई डिजाइन है।

मेरी विविधता 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 
     } 
    } 
} 

दूसरों के लाभ के लिए इस बदलाव पोस्ट करना।

संबंधित मुद्दे