Required Properties(必備屬性)

有時(shí),您的組件需要設置一些屬性,但沒(méi)有合適的默認值。例如,您可能關(guān)心按鈕的易訪(fǎng)問(wèn)性(Accessibility),因此當您創(chuàng )建了一個(gè)AccessibleButton控件,它至少應該有一個(gè)description屬性。

 

但是,按鈕具有description屬性這一事實(shí)并不意味著(zhù)任何人都會(huì )設置它。所以您或您的同事可能會(huì )在某個(gè)時(shí)候用以下代碼實(shí)例化組件:


關(guān)于易訪(fǎng)問(wèn)性就講到這里:現在description屬性只是一個(gè)空字符串!當然,您可以為屬性設置一個(gè)默認值,但是用哪個(gè)呢?“Button”基本沒(méi)用。"您不應該聽(tīng)到這個(gè)"?好吧,至少QA現在可能會(huì )針對它。但是,如果QML引擎知道需要設置此屬性,不是更有用嗎?

不幸的是,在Qt 5.15之前沒(méi)有辦法強制設置description屬性。但從Qt 5.15開(kāi)始,這就成為可能:


 


現在,如果創(chuàng )建一個(gè)AccessibleButton,但沒(méi)有設置description屬性,那么整個(gè)應用程序將無(wú)法啟動(dòng)。但如果該組件是動(dòng)態(tài)創(chuàng )建的(例如通過(guò)Loader加載),則無(wú)法做到這一點(diǎn)。這種情況下,將僅出現運行時(shí)警告。

我們還計劃為qmllintQtCreator添加更多的工具支持,以便在未設置Required Properties時(shí)顯示警告。

Required PropertiesDelegates

此外,Required PropertiesDelegates中扮演著(zhù)特殊的角色。正如您可能知道的,Delegates可以通過(guò)名稱(chēng)以及其他屬性,如modelindex,直接訪(fǎng)問(wèn)所提供的模型角色。


 


如果您的Delegates不包含Required Properties,則此處不會(huì )發(fā)生任何更改。但是,如果它們包含至少一個(gè)Required Properties,那么這些名稱(chēng)就不能再訪(fǎng)問(wèn)了。相反,您必須將它們顯式的指定為Required Properties。


 


然后QML引擎將相應設置Required Properties。請注意,如您的model是可編輯的,新方法和舊方法之間有一個(gè)重要的區別:使用舊方法,您可以這樣寫(xiě)代碼:


model也會(huì )相應更新。但如果你這樣寫(xiě)代碼

 


然后,description的綁定將被破壞(QML引擎將會(huì )打印警告),model將不會(huì )被更新。我們決定采用這種行為,以確保無(wú)論在delegates中或在delegates之外使用,components的行為不會(huì )有太大的差異。此外,我們也不鼓勵任何人對屬性執行命令式賦值(因為這通常會(huì )破壞綁定)。

如果您確實(shí)想要更新model的值,當然還有一種辦法可以實(shí)現:將model設置為Required Properties并用以下代碼



我們建議您始終在Delegates中使用Required Properties。這避免了非限定查找,后者對工具來(lái)說(shuō)是個(gè)問(wèn)題,并往往會(huì )降低處理速度。

Inline Components(內聯(lián)組件)

Qt 5.15中的另一個(gè)新特性是內聯(lián)組件。顧名思義,它們允許您在文件中定義一個(gè)新組件?;菊Z(yǔ)法是


 

在文件內部,您可以通過(guò)名稱(chēng)引用新組件,就像在其自己的文件中定義的一樣。讓我們以LabeledImage組件為例來(lái)說(shuō)明其工作原理:



您也可以在其它文件中引用該組件。在這種情況下,您需要在其名字之前加上包含其組件的名稱(chēng):


您可能會(huì )想,既然QML已經(jīng)有了組件類(lèi)型,為什么還要使用內聯(lián)組件呢?查看前面的示例,我們可以看到,內聯(lián)組件使您可以執行組件無(wú)法執行的以下操作:

您可以在沒(méi)有Loader開(kāi)銷(xiāo)的情況下創(chuàng )建組件實(shí)例。

您可以在屬性聲明中使用組件類(lèi)型。

您可以在定義組件的文件之外的其他文件中引用該組件。

希望您能和我們一樣方便地找到內聯(lián)組件!

Nullish Coalescing(空值合并)

最后一個(gè)新語(yǔ)言特性是由我們的實(shí)習生Maximilian Goldstein實(shí)現的。雖然QML通常只支持EcmaScript 6,但是Maximilian為一個(gè)即將提出的語(yǔ)言特性增加了支持,該特性正在被添加到最新的EcmaScript標準中:空值合并。引用MDN:

空值合并操作符(??)是一個(gè)邏輯操作符,當其左側操作數為空或未定義時(shí),返回其右側操作數,否則返回其左側操作數。

有關(guān)詳細信息,請參閱MDN頁(yè)面。下面是一個(gè)示例,演示如何在QML中使用它來(lái)設置JSON中的屬性,并在未提供屬性的情況下提供合理的默認值。

注意我們在設置brightness時(shí)不能用“||”代替“??”。因為settings.brightness可能已經(jīng)是0,在這種情況下,我們將獲取默認值。