2013-10-23 6 views
7

Voglio creare un componente QML personalizzato con due proprietà one e two, che dovrebbero avere valori predefiniti quando non sono inizializzati. In particolare, se two dovrebbe ottenere un valore iniziale depurato su one. Il seguente codiceCome evitare di creare un bind di proprietà sull'inizializzazione in QML?

Rectangle { 
    property int one: 1 
    property int two: 2 * one 
} 

tuttavia crea una proprietà vincolante: Ogni volta che one modifiche, two viene aggiornato al nuovo valore di 2 * one. Come posso inizializzare two al valore di 2 * one senza creare un'associazione?

+4

un modo che puoi fare è inizializzarlo manualmente su Component.onCompleted, ma questo non sembra il modo ideale – Kunal

risposta

0

In effetti, non dovresti. Binding è il comportamento di base di QML, se cerchi di evitarlo, allora è perché non stai pensando nel modo giusto.

Per exemple, se proprietà di due valore iniziale è calcolato con proprietà un valore iniziale ma non proprietà un valore,

Poi che significa che si desidera associare il Valore iniziale non valore, è necessario creare una proprietà di sola lettura quale valore sarà proprietà un valore iniziale:

readonly property int initialOne : 1; 
property int one : initialOne; 
property int two : 2 * initialOne; 

potrebbe sembrare un po 'pesante, ma se ci pensate, il valore iniziale è quello che uso voglia, e così, il concetto della proprietà è quello che si vuole veramente

+0

Cosa succede se initialOne dipende da parent.width (ad esempio) come proprietà readonly int initialOne: parent.width? – Korchkidu

+0

Se riesco a evitare associazioni inutili in alcune situazioni, quindi perché dovrei avere? In alcune situazioni non è necessario legare. Immagina di creare un'app con dimensioni esplicite o immutabili (ad esempio ciò che accade sui dispositivi mobili). In questo caso non è necessario legare larghezza o altezza e così via.Potrebbe essere necessario modificare una proprietà in un momento e non è importante eventuali modifiche successive del valore. Immagina di usare 'PropertyChanges' e le modifiche di valore comunemente. È obbligatorio e il suo sovraccarico è necessario ?! –

+0

@ S.M.Mousavi: no hai ragione, l'associazione non è sempre necessaria. Ma le proprietà Qml non sono le stesse delle variabili, quando hai definito una base di proprietà su un calcolo. stai definendo la relazione tra queste due proprietà. Se vuoi che una proprietà abbia un valore basato su un calcolo, che non cambierà più tardi, non dovresti usare la proprietà, dovresti usare una variabile – BlueMagma

0

Doppio controllo che non c'è non è necessario legare e fare attenzione a non rendere i codici sporchi.
si può riempire di proprietà con un valore molto presto come segue:

window { 
    id: win 
    width: 300; height: 450 
    color: "#d8d8d8" 
    Item { 
     property int val1 
     property int val2 
     property int val3: parent.width //<-- Binding 
     Component.onCompleted: { 
      val1 = win.width; //<---| 
      val2 = win.height; //<---|=== There is no binding. Just changes value 
      /* ... */ 
     } 
    } 
} 

(non sono sicuro, si può essere in grado di impostare il valore iniziale tramite Component.onStatusChanged e Component.Ready stato)

Avviso per le prestazioni: I segnali e i codici Javascript hanno un impatto sulle prestazioni. Potrebbe essere più efficiente usare i binding. Usa Profiler per verificarlo. Se vuoi impostare i valori iniziali di più proprietà o hai già utilizzato il segnale onCompleted, questo migliorerà le prestazioni!

0

esplicitamente rompere il legame al completamento componente:

Rectangle { 
    property int one: 1 
    property int two: 2 * one 
    Component.onCompleted: two = two 
} 

L'assegnazione two = two rompe il legame e two non viene più aggiornato come one modifiche.

Problemi correlati