2015-07-10 35 views
0

Element.qml如何在分配前驗證Qml屬性值?

Item{ 
    property int step 
    property int minValue 
    property int maxValue 
    property int value //should accept values of form i*step+minValue 
} 

main.qml

Element{ 
    step:2 
    minValue:-7 
    maxValue:7 
    value:0 //not an acceptable value(2*i-7), should convert to 1 or -1 
} 

如果我設置值時,它應值轉換爲最接近的step*i+minValue, 即01然後發射valueChanged()

我想valueChanged()信號只有當它的值是step*i+minValue時發出。

回答

0

據我所知,沒有辦法設置屬性驗證器。可能的解決方法如下所示。考慮一個只接受正數的屬性。

Item { 
    property int value: 0 
    property int _value: 0 
    on_ValueChanged: { 
     if(_value > 0) 
      value = _value; 
    } 
} 

同樣的方法可以在C++中使用,如果Item是你的自定義類:這種特性可以如下編碼。

1

你不能做一個預先測試,並在它上面valueChanged信號將被髮送。 唯一的解決方案是在onValueChanged插槽中做測試併發送一個自定義信號,你最不會發送valueChanged()信號使它連接到onValueChanged插槽。

import QtQuick 2.2 
import QtQuick.Layouts 1.1 
import QtQuick.Controls 1.2 

Item{ 
    property int step :2 
    property int minValue :-7 
    property int maxValue: 7 
    property int value: 0 //should accept values of form i*step+minValue 

    signal sgnValueChanged(int value) 

    Column{ 

     TextInput{ 
      id:input 
      width: 100 
      height: 20 
     } 

     Rectangle{ 
      id:button 
      width: 100 
      height: 20 
      color:"#f0ffff" 
      MouseArea{ 
       anchors.fill:parent 
       onClicked: 
       { 
        value = parseInt(input.text) 

       } 
      } 
     } 
    } 

    onValueChanged: 
    { 
     if(value >= minValue && value <= maxValue) 
     { 
      sgnValueChanged(step * value + minValue) 
     } 

     else 
     { 
      console.log("not acceptable value") 
     } 
    } 
}