Qt 5 15中新的QML語言特性

2021-10-07 07:27:14 字數 2623 閱讀 4845

本文翻譯自:new qml language features in qt 5.15

校審:kenny zhang

有時,您的元件需要設定一些屬性,但沒有合適的預設值。例如,您可能關心按鈕的易訪問性(accessibility),因此當您建立了乙個accessiblebutton控制項,它至少應該有乙個description屬性。

// accessiblebutton.qml

button

但是,按鈕具有description屬性這一事實並不意味著任何人都會設定它。所以您或您的同事可能會在某個時候用以下**例項化元件:

accessiblebutton 

}

關於易訪問性就講到這裡:現在description屬性只是乙個空字串!當然,您可以為屬性設定乙個預設值,但是用哪個呢?「button」基本沒用。「您不應該聽到這個」?好吧,至少qa現在可能會針對它。但是,如果qml引擎知道需要設定此屬性,不是更有用嗎?

不幸的是,在qt 5.15之前沒有辦法強制設定description屬性。但從qt 5.15開始,這就成為可能:

button
現在,如果建立乙個accessiblebutton,但沒有設定description屬性,那麼整個應用程式將無法啟動。但如果該元件是動態建立的(例如通過loader載入),則無法做到這一點。這種情況下,將僅出現執行時警告。

我們還計畫為qmllint和qtcreator新增更多的工具支援,以便在未設定required properties時顯示警告。

此外,required properties在delegates中扮演著特殊的角色。正如您可能知道的,delegates可以通過名稱以及其他屬性,如model和index,直接訪問所提供的模型角色。

listview 

}

如果您的delegates不包含required properties,則此處不會發生任何更改。但是,如果它們包含至少乙個required properties,那麼這些名稱就不能再訪問了。相反,您必須將它們顯式的指定為required properties。

listview 

}

text
model也會相應更新。但如果你這樣寫**

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

如果您確實想要更新model的值,當然還有一種辦法可以實現:將model設定為required properties並用以下**

component.oncompleted: model.description=

"my fancy new text"

我們建議您始終在delegates中使用required properties。這避免了非限定查詢,後者對工具來說是個問題,並往往會降低處理速度。

qt 5.15中的另乙個新特性是內聯元件。顧名思義,它們允許您在檔案中定義乙個新元件。基本語法是

component 

: basetype

在檔案內部,您可以通過名稱引用新元件,就像在其自己的檔案中定義的一樣。讓我們以labeledimage元件為例來說明其工作原理:

// images.qml

import qtquick 2.15

item

text

} row

labeledimage

} property labeledimage selectedimage: before

}

您也可以在其它檔案中引用該元件。在這種情況下,您需要在其名字之前加上包含其元件的名稱:

// labeledimagebox.qml

import qtquick 2.15

rectangle

}

您可能會想,既然qml已經有了元件型別,為什麼還要使用內聯元件呢?檢視前面的示例,我們可以看到,內聯元件使您可以執行元件無法執行的以下操作:

希望您能和我們一樣方便地找到內聯元件!

最後乙個新語言特性是由我們的實習生maximilian goldstein實現的。雖然qml通常只支援ecmascript 6,但是maximilian為乙個即將提出的語言特性增加了支援,該特性正在被新增到最新的ecmascript標準中:空值合併。引用mdn:

空值合併操作符(??)是乙個邏輯操作符,當其左側運算元為空或未定義時,返回其右側運算元,否則返回其左側運算元。

有關詳細資訊,請參閱mdn頁面。下面是乙個示例,演示如何在qml中使用它來設定json中的屬性,並在未提供屬性的情況下提供合理的預設值。

item
注意我們在設定brightness時不能用「||」代替「??」。因為settings.brightness可能已經是0,在這種情況下,我們將獲取預設值。

MySQL 8 中新的複製功能

mysql 8 中新的複製功能使得操作更加方便,並幫助使用者更好地觀察複製過程中內部發生的情況。使用 mysql 5.7.17 獲取 mysql 組複製外掛程式是一項巨大的工作。組複製是乙個新的外掛程式,通過使用組通訊和狀態機複製,為使用者提供了一些不錯的複製屬性。這使得系統能夠免受 腦裂 情況影響...

JDK8中新的日期類學習

1 獲得當前日期 年 月 日 localdate localdate localdate.now system.out.println localdate 返回的是個列舉物件 system.out.println 年 localdate.getyear t月 localdate.getmonth g...

JDK17中新的特性之密封類

在jdk17中新增了密封類。密封的類和介面限制了哪些其他類或介面可以拓展或實現它們。密封類這個新的特性在jdk15和jdk16中作為預覽功能。現在在jdk17中作為正式的功能,它與jdk16相比沒有任何變化。密封類的作用和目標 密封類示例 我門首先定義乙個密封類 shape,這裡定義成了乙個抽象的密...