2013-10-23 14 views
7

Tôi muốn tạo thành phần QML tùy chỉnh với hai thuộc tính onetwo, phải có giá trị mặc định khi không được khởi tạo. Cụ thể, nếu two sẽ nhận được giá trị ban đầu giảm trên one. Các mã sauLàm cách nào để tránh tạo thuộc tính ràng buộc khi khởi tạo trong QML?

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

tuy nhiên tạo ra một tài sản ràng buộc: Bất cứ khi nào one thay đổi, two được cập nhật các giá trị mới của 2 * one. Làm cách nào để tôi có thể khởi tạo two thành giá trị của 2 * one mà không cần tạo sự ràng buộc?

+4

một cách bạn có thể làm là khởi tạo thủ công trên Component.onCompleted, nhưng điều đó dường như không lý tưởng cách – Kunal

Trả lời

0

Thực tế, bạn không nên. Ràng buộc là hành vi cơ bản của QML, nếu bạn cố gắng tránh nó, thì đó là vì bạn không nghĩ cách tốt.

Đối dụ, nếu sở hữu hai giá trị ban đầu được tính với sở hữu một giá trị ban đầu nhưng không sở hữu một giá trị,

Sau đó có nghĩa là bạn muốn để ràng buộc trên giá trị ban đầu không giá trị, bạn nên tạo một thuộc tính chỉ đọc chỉ đọc giá trị nào sẽ là thuộc tính giá trị ban đầu:

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

Nó có vẻ hơi nặng, nhưng nếu bạn nghĩ về nó, giá trị ban đầu là những gì bạn muốn sử dụng, và vì vậy, các khái niệm về tài sản là những gì bạn thực sự muốn

+0

Điều gì xảy ra nếu initialOne phụ thuộc vào parent.width (ví dụ) như thuộc tính chỉ đọc int initialOne: parent.width? – Korchkidu

+0

Nếu tôi có thể tránh những ràng buộc không cần thiết trong một số trường hợp, vậy tại sao tôi nên có? Trong một số trường hợp, không cần phải ràng buộc. Hãy tưởng tượng tạo một ứng dụng có kích thước rõ ràng hoặc không thể thay đổi (như những gì xảy ra trên thiết bị di động). Trong trường hợp này không cần phải ràng buộc chiều rộng hoặc chiều cao và vân vân.Bạn có thể cần phải thay đổi một tài sản trong thời điểm này và nó không quan trọng bất kỳ thay đổi giá trị sau này. Hãy tưởng tượng sử dụng 'PropertyChanges' và thay đổi giá trị thường. Là ràng buộc và chi phí cần thiết của nó ?! –

+0

@ S.Mousavi: không có bạn đúng, ràng buộc không phải lúc nào cũng cần thiết. Nhưng thuộc tính Qml không giống như các biến, khi bạn đã định nghĩa một thuộc tính cơ sở trên một phép tính. bạn đang xác định mối quan hệ giữa hai thuộc tính này. Nếu bạn muốn thuộc tính có giá trị dựa trên phép tính, điều đó sẽ không thay đổi sau này, bạn không nên sử dụng thuộc tính, bạn nên sử dụng biến số – BlueMagma

0

Kiểm tra lại rằng có không cần phải ràng buộc và cẩn thận về việc không làm cho mã bẩn.
Bạn có thể điền bất động sản với giá trị rất sớm như sau:

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 
      /* ... */ 
     } 
    } 
} 

(Tôi không chắc chắn, bạn có thể thiết lập giá trị ban đầu sử dụng Component.onStatusChangedComponent.Ready status)

Thông báo cho Hiệu suất: Mã tín hiệu và Javascript có một số tác động hiệu suất. Nó có thể hiệu quả hơn để sử dụng các ràng buộc. Sử dụng Profiler để kiểm tra điều đó. Nếu bạn muốn đặt giá trị ban đầu của nhiều thuộc tính hoặc bạn đã sử dụng tín hiệu onCompleted, vì vậy điều này sẽ cải thiện hiệu suất!

0

Rõ ràng phá vỡ các ràng buộc sau khi hoàn thành phần:

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

Việc chuyển nhượng two = two phá vỡ ràng buộc và two không còn được cập nhật khi one thay đổi.

Các vấn đề liên quan