• <menu id="w2i4a"></menu>
  • logo Qt使用教程2020

    文檔首頁>>Qt使用教程2020>>C++界面開發(fā)程序Qt使用教程:Qt 5.15中新的QML語言特性

    C++界面開發(fā)程序Qt使用教程:Qt 5.15中新的QML語言特性


    Qt是目前最先進、最完整的跨平臺C++開發(fā)工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運用于超過70個行業(yè)、數千家企業(yè),支持數百萬設備及應用。

    點擊下載Qt最新試用版

    必需屬性(必備屬性)

    有時,您的組件需要設置一些屬性,但沒有合適的替代值。例如,您可能關心按鈕的易訪問性(Accessibility),因此當您創(chuàng)建了一個AccessibleButton控件時,它至少應該有一個描述屬性。

    // AccessibleButton.qml
    Button {
        property string description
        Accessible.description: description
    }

    但是,按鈕具有描述屬性這一事實并不意味著任何人都會設置它。所以您或您的同事可能會在某個時候用以下代碼實例化組件:

    AccessibleButton {
        onClicked: (mouse)  => { /* fancy business logic here */ }
    }

    關于易訪問性就講到這里:現在描述屬性只是一個空字符串!當然,您可以為屬性設置一個位置值,但是用其中呢?“ Button”基本沒用?!澳粦撀牭竭@個”?好吧,至少QA現在可能會針對它。但是,如果QML引擎知道需要設置此屬性,不是更有用嗎?

    不幸的是,在Qt 5.15之前沒有辦法強制設置描述屬性。但從Qt 5.15開始,這就可能:

    Button {
        required property string description
        Accessible.description: description
    }

    現在,如果創(chuàng)建一個AccessibleButton,但沒有設置描述屬性,那么整個應用程序將無法啟動。但如果該組件是動態(tài)創(chuàng)建的(例如通過Loader加載),則無法做到這一點。這種情況下,將僅出現運行時警告。

    我們還計劃為qmllint和QtCreator添加更多的工具支持,踩在未設置必需的屬性時顯示警告。

    必需的屬性和代表

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

    ListView {
        model: root.myModel
        delegate: Text {
            id: delegate
            color: index % 2 ? "gray" : "black"
            text: description
        }
    }

    如果,您的代表不包含必需屬性,則此處不會發(fā)生任何更改。但是,如果它們包含至少一個必需屬性,那么這些名稱就不能再訪問了。相反,您必須將其顯式的指定為必需屬性。

    ListView {
        model: root.myModel
        delegate: Text {
            id: delegate
            required property int index
            required property string description
            color: index % 2 ? "gray" : "black"
            text: description
        }
    }

    然后請注意,如您的模型是可編輯的,新方法和舊方法之間有一個重要的區(qū)別:使用舊方法,您可以這樣寫代碼:

    Text {
        id: delegate
        Component.onCompleted: description = "My fancy new text"
    }

    模型也會相應更新。但如果你這樣寫代碼

    Text {
        id: delegate
        required property string description
        Component.onCompleted: delegate.description = "My fancy new text"
    }

    然后,說明的綁定將被破壞(QML引擎將會打印警告),模型將不會被更新。我們決定采用這種行為,以確保無論在delegates中還是在delegates以外使用,組件的行為不會還有,我們也不鼓勵任何人對屬性執(zhí)行命令式賦值(因為這通常會破壞綁定)。

    如果您確實想要更新模型的值,當然還有一種方法可以實現:將模型設置為必需的屬性并用以下代碼

    Component.onCompleted: model.description= "My fancy new text"

    我們建議您始終在Delegates中使用必選屬性。這避免了非限定查找,少數對工具來說是個問題,并經常會降低處理速度。

    內聯(lián)組件

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

      component <component name> : BaseType {
        // declare properties and bindings here
    }

    在我們內部,您可以通過名稱引用新組件,就像在其自己的文件中定義的一樣。讓我們以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已經有了組件類型,為什么還要使用內聯(lián)組件呢?查看前面的示例,我們可以看到,內聯(lián)組件使您可以執(zhí)行組件無法執(zhí)行的以下操作:

    • 您可以在沒有Loader規(guī)模的情況下創(chuàng)建組件實例。
    • 您可以在屬性聲明中使用組件類型。
    • 您可以在定義組件的文件之外的其他文件中引用該組件。

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

    空值合并

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

    空值合并操作符(??)是一個邏輯操作符,當其頂端操作數為空或未定義時,返回其右側操作數,否則返回其開頭操作數。

    下面是一個示例,演示如何在QML中使用它來設置JSON中的屬性,并在未提供屬性的情況下提供合理的替代值。

    Item {
        property var settings
        property int brightness: settings.brightness ?? 100
        property color color: settings.color ?? "blue"
        Component.onCompleted: settings = JSON.parse(settingsString)
    }

    注意我們在設置brightness時不能用“ ||”代替“ ??”。因為settings.brightness可能已經是0,在這種情況下,我們將獲取替換值。


    想要購買Qt正版授權的朋友可以點擊"咨詢在線客服"哦~~~

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();