翻譯|使用教程|編輯:吳園園|2020-06-05 09:44:27.550|閱讀 723 次
概述:隨著Qt 6.0即將帶來的重大變化,QML已在5.15中加入了一些新的語言特性。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt是目前最先進(jìn)、最完整的跨平臺C++開發(fā)工具。它不僅完全實(shí)現(xiàn)了一次編寫,所有平臺無差別運(yùn)行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運(yùn)用于超過70個(gè)行業(yè)、數(shù)千家企業(yè),支持?jǐn)?shù)百萬設(shè)備及應(yīng)用。
必需屬性(必備屬性)
有時(shí),您的組件需要設(shè)置一些屬性,但沒有合適的替代值。例如,您可能關(guān)心按鈕的易訪問性(Accessibility),因此當(dāng)您創(chuàng)建了一個(gè)AccessibleButton控件時(shí),它至少應(yīng)該有一個(gè)描述屬性。
// AccessibleButton.qml Button { property string description Accessible.description: description }
但是,按鈕具有描述屬性這一事實(shí)并不意味著任何人都會設(shè)置它。所以您或您的同事可能會在某個(gè)時(shí)候用以下代碼實(shí)例化組件:
AccessibleButton { onClicked: (mouse) => { /* fancy business logic here */ } }
關(guān)于易訪問性就講到這里:現(xiàn)在描述屬性只是一個(gè)空字符串!當(dāng)然,您可以為屬性設(shè)置一個(gè)位置值,但是用其中呢?“ Button”基本沒用。“您不應(yīng)該聽到這個(gè)”?好吧,至少Q(mào)A現(xiàn)在可能會針對它。但是,如果QML引擎知道需要設(shè)置此屬性,不是更有用嗎?
不幸的是,在Qt 5.15之前沒有辦法強(qiáng)制設(shè)置描述屬性。但從Qt 5.15開始,這就可能:
Button { required property string description Accessible.description: description }
現(xiàn)在,如果創(chuàng)建一個(gè)AccessibleButton,但沒有設(shè)置描述屬性,那么整個(gè)應(yīng)用程序?qū)o法啟動。但如果該組件是動態(tài)創(chuàng)建的(例如通過Loader加載),則無法做到這一點(diǎn)。這種情況下,將僅出現(xiàn)運(yùn)行時(shí)警告。
我們還計(jì)劃為qmllint和QtCreator添加更多的工具支持,踩在未設(shè)置必需的屬性時(shí)顯示警告。
必需的屬性和代表
此外,Required Properties在Delegates中扮演著特殊角色。。您可能知道的,Delegates可以通過名稱以及其他屬性,如model和index,直接訪問所提供的模型角色。
ListView { model: root.myModel delegate: Text { id: delegate color: index % 2 ? "gray" : "black" text: description } }
如果,您的代表不包含必需屬性,則此處不會發(fā)生任何更改。但是,如果它們包含至少一個(gè)必需屬性,那么這些名稱就不能再訪問了。相反,您必須將其顯式的指定為必需屬性。
ListView { model: root.myModel delegate: Text { id: delegate required property int index required property string description color: index % 2 ? "gray" : "black" text: description } }
然后請注意,如您的模型是可編輯的,新方法和舊方法之間有一個(gè)重要的區(qū)別:使用舊方法,您可以這樣寫代碼:
Text { id: delegate Component.onCompleted: description = "My fancy new text" }
模型也會相應(yīng)更新。但如果你這樣寫代碼
Text { id: delegate required property string description Component.onCompleted: delegate.description = "My fancy new text" }
然后,說明的綁定將被破壞(QML引擎將會打印警告),模型將不會被更新。我們決定采用這種行為,以確保無論在delegates中還是在delegates以外使用,組件的行為不會還有,我們也不鼓勵任何人對屬性執(zhí)行命令式賦值(因?yàn)檫@通常會破壞綁定)。
如果您確實(shí)想要更新模型的值,當(dāng)然還有一種方法可以實(shí)現(xiàn):將模型設(shè)置為必需的屬性并用以下代碼
Component.onCompleted: model.description= "My fancy new text"
我們建議您始終在Delegates中使用必選屬性。這避免了非限定查找,少數(shù)對工具來說是個(gè)問題,并經(jīng)常會降低處理速度。
內(nèi)聯(lián)組件
Qt 5.15中的另一個(gè)新特性是內(nèi)聯(lián)組件。顧名思義,它們允許您在文件中定義一個(gè)新組件。基本語法是
component <component name> : BaseType { // declare properties and bindings here }
在我們內(nèi)部,您可以通過名稱引用新組件,就像在其自己的文件中定義的一樣。讓我們以LabeledImage組件為例來說明其工作原理:
// Images.qml import QtQuick 2.15 Item { component LabeledImage: Column { property alias source: image.source property alias caption: text.text Image { id: image width: 50 height: 50 } Text { id: text font.bold: true } } Row { LabeledImage { id: before source: "before.png" caption: "Before" } LabeledImage { id: after source: "after.png" caption: "After" } } property LabeledImage selectedImage: before }
您也可以在其他文件中引用該組件。在這種情況下,您需要在其名字之前加上其組件的名稱:
// LabeledImageBox.qml import QtQuick 2.15 Rectangle { property alias caption: image.caption property alias source: image.source border.width: 2 border.color: "black" Images.LabeledImage { id: image } }
您可能會想,既然QML已經(jīng)有了組件類型,為什么還要使用內(nèi)聯(lián)組件呢?查看前面的示例,我們可以看到,內(nèi)聯(lián)組件使您可以執(zhí)行組件無法執(zhí)行的以下操作:
希望您能和我們一樣方便地找到內(nèi)聯(lián)組件!
空值合并
雖然QML通常只支持EcmaScript 6,但是Maximilian為一個(gè)即將推出的語言特性增加了支持,該特性正在被添加到最新的EcmaScript標(biāo)準(zhǔn)中:空。最后一個(gè)新語言特性是由我們的實(shí)習(xí)生Maximilian Goldstein實(shí)現(xiàn)的。值合并。引用MDN:
空值合并操作符(??)是一個(gè)邏輯操作符,當(dāng)其頂端操作數(shù)為空或未定義時(shí),返回其右側(cè)操作數(shù),否則返回其開頭操作數(shù)。
下面是一個(gè)示例,演示如何在QML中使用它來設(shè)置JSON中的屬性,并在未提供屬性的情況下提供合理的替代值。
Item { property var settings property int brightness: settings.brightness ?? 100 property color color: settings.color ?? "blue" Component.onCompleted: settings = JSON.parse(settingsString) }
注意我們在設(shè)置brightness時(shí)不能用“ ||”代替“ ??”。因?yàn)閟ettings.brightness可能已經(jīng)是0,在這種情況下,我們將獲取替換值。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: