我有一個 CustomQMLComponent。它有3個屬性。p3 依賴于 p1 和 p2。p1 & p2 在創建 CustomQMLComponent 的實體時設定。
問題:
- 到 p3 被評估時,p1 和 p2 是否總是具有呼叫者設定的值。
- 設定 p3 的推薦方法是什么,如下所示或在注釋陳述句中?
自定義QMLComponent.qml:
Item {
required property string p1
property bool p2 : false
property int p3: cppContextPropertyObj.slot(p1, p2)
//Component.onCompleted: p3 = cppContextPropertyObj.slot(p1, p2)
}
主.qml:
CustomQMLComponent{
p1: "my_string"
p2: true
}
更新:
p1 和 p2 具有靜態值分配,??而 p3 具有系結值分配。
根據這篇舊文章:https : //www.kdab.com/qml-engine-internals-part-2-bindings/,靜態值分配發生在創建階段,系結值分配發生在創建階段結束時。
情況1:
CustomQMLComponent{}
在這種情況下,根據上述文章,p1 和 p2 值是在設定 p3 值時設定的。
案例2:
CustomQMLComponent{
p1: "my_string"
p2: true
}
在這種情況下會發生什么?
在更一般的意義上,當創建組件的實體時設定組件的屬性會發生什么?屬性是否使用默認值初始化,然后被新實體的值覆寫?或者,屬性僅使用默認/新值初始化一次。
uj5u.com熱心網友回復:
這一行不僅僅是一個賦值,它也是一個系結:
property int p3: cppContextPropertyObj.slot(p1, p2)
這意味著每次在其中參考的屬性(在本例中為 p1 和 p2)發生更改時都會重新評估它 - 即發出它們的 *Changed 事件。
因此,只要依賴于 p3 的任何東西都可以多次處理 p3 更改值,并且該slot方法可以在 p1 和 p2 穩定時處理它們的各種值,這并不重要。
要查看在此特定情況下將發生的確切順序,請添加 onP1Changed、onP2Changed 和 onP3Changed 事件處理程式并將它們的值記錄到控制臺。
uj5u.com熱心網友回復:
Qt 支持的回復:
根據這篇舊文章:https : //www.kdab.com/qml-engine-internals-part-2-bindings/,靜態值分配發生在創建階段,系結值分配發生在創建階段結束時。
這就是它應該的樣子,首先是文字,然后是函式。但實際上并沒有記錄,所以理論上它可能會改變。這也僅適用于簡單的文字賦值。任何稍微暗示復雜性的事情都會使 QML 引擎將它們與所有需要評估的人一起推遲。例如,如果您像這樣用 {} 包裝值,就會發生這種情況: p2: {true}
情況1:
CustomQMLComponent{}
在這種情況下,根據上述文章,p1 和 p2 值是在設定 p3 值時設定的。
這些“靜態”屬性的設定順序是未定義的,更復雜的運算式的執行順序也是未定義的。所以最好避免對順序做出假設。
案例2:
CustomQMLComponent{
p1: "my_string"
p2: true
}
在這種情況下會發生什么?
在更一般的意義上,當創建組件的實體時設定組件的屬性會發生什么?屬性是否使用默認值初始化,然后被新實體的值覆寫?或者,屬性僅使用默認/新值初始化一次。
就一次。盡管在分配 QML 中的值之前,這些屬性當然有一些默認值。在 C 類的建構式中設定的初始值,或者在 QML 定義屬性的情況下,型別的默認構造值(空字串、0、false 或 null,如果它是 QObject* 型別)。
為什么這很重要是因為像 onXXXChanged 這樣的信號在發生時會立即處理,因此它可以在所有這些“靜態”分配完成之前運行。考慮例如:
onP1Changed: if (p2) {...} else {...}
QML 引擎不知道 p2 對 p1 值更改存在某種依賴性,并且如果 p1 在 p2 之前被分配,這可能會采用意外的路徑,并且如果在這種情況下 p2 值更改也未明確處理,則可能導致狀態不匹配.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387543.html
上一篇:創建可調整大小的Qml對話框
