在 QML 中使用 Text.implicitWidth 时的性能损失

Posted

技术标签:

【中文标题】在 QML 中使用 Text.implicitWidth 时的性能损失【英文标题】:Performance Penalty when using Text.implicitWidth in QML 【发布时间】:2016-12-19 14:40:05 【问题描述】:

Item的文档中可以找到:

注意:使用 Text 或 TextEdit 的implicitWidth 并显式设置宽度会导致性能损失,因为文本必须布局两次。

所以我不应该这样写:

Text 
    width: implicitWidth
    text: 'my text defines the width'

这意味着,如果我不通过其他方式设置宽度,我将无法有意义地锚定到 Text

我想知道同样的性能损失是否适用于这种结构:

Item 
    id: myAnchorableTextBoundingBox
    width: myText.implicitWidth
    height: myText.implicitHeight
    Text 
        id: myText
        text: 'my text defines the width'
    

或者这是这个用例的一个可能的解决方法?

它甚至允许我像这样省略最大宽度:

Rectangle 
    color: 'transparent'
    border.color: 'red'
    width: myText.width + 2
    height: myText.height + 2


Rectangle 
    id: myAnchorableTextBoundingBox
    y: 1
    x: 1
    border.color: 'black'
    width: myText.truncated ? myText.width : myText.implicitWidth
    height: myText.implicitHeight
    Text 
        id: myText
        text: 'my text defines the width until it elides, then the width is used as limit'
        elide: Text.ElideRight
        width: 200
    

我会立即建立一个Component,如果我可以肯定的话,不会有(太大的)惩罚。

【问题讨论】:

【参考方案1】:

此解决方法应该可以正常工作。正如文档所述,性能损失只是设置宽度时的一个问题:

使用implicitWidth [...] 并显式设置宽度会导致性能损失

在这种情况下,您只是读取implicitWidth 属性,而不是设置Text 元素的width,因此警告不适用。

【讨论】:

以上是关于在 QML 中使用 Text.implicitWidth 时的性能损失的主要内容,如果未能解决你的问题,请参考以下文章

C++ 和 QML 中的 QT QML 项

如何在 QML 中编辑 QQmlListProperty

在 C++ 中被动使用 QtQuick / QML

删除 c++ 模型,使用 SetContextProperty 在 qml 中注册

在 qml ui 表单中使用行为

如何在 QML 的 ColumnLayout 中使用 topMargin