必需的属性不适用于中继器

San*_*912 7 qt qml

我有一个这样的组件:

import QtQuick 2.15

Item {
    id: root

    property double value: 0.0

    property int core: 1

    property color progressBarColor: "black"
    property color minMaxTextColor: "black"
    property int fontSize: height - 6

//....
}
Run Code Online (Sandbox Code Playgroud)

现在我认为让一些属性成为必需的是一个好主意,因为它们应该在使用组件时声明。所以我改成这样:

import QtQuick 2.15

Item {
    id: root

    required property double value

    required property int core

    property color progressBarColor: "black"
    property color minMaxTextColor: "black"
    property int fontSize: height - 6

//....
}
Run Code Online (Sandbox Code Playgroud)

该组件在转发器中被调用,如下所示:

SystemInformation{
    id: sysinfo
}

Column{
    id: displayColumn


    Repeater{
        model: sysinfo.coreUtilizationsInPercent.length

        CoreUtilizationDisplay{
            width: root.elementWidth
            height: root.elementHeight
            fontSize: root.fontSize

            progressBarColor: "#3399FF" // blue
            minMaxTextColor: "blue"

            core: index + 1
            value: sysinfo.coreUtilizationsInPercent[index]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这工作正常,直到我获得所需的属性。我想知道为什么它不起作用?

如果我声明它是必需的,我会收到此错误:

qrc:/qml/SystemInformationDisplay.qml:57: ReferenceError: index is not defined
Run Code Online (Sandbox Code Playgroud)

我对中继器中没有的类似组件做了同样的事情,并且工作正常。

为什么?

Seb*_*anH 7

来自qt开发博客

如果您的委托不包含必需的属性,则此处不会发生任何变化。但是,如果它们至少包含一个必需的属性,则这些名称将无法再访问。相反,您必须通过将它们指定为必需属性来明确选择加入。

在这种情况下,您需要将所需的属性索引添加到组件中。

import QtQuick 2.15

Item {
    id: root

    required property double value
    required property int core

    required property int index // add it 

    property color progressBarColor: "black"
    property color minMaxTextColor: "black"
    property int fontSize: height - 6

//....
}
Run Code Online (Sandbox Code Playgroud)

通过这个附加索引,您可以构建组件并访问索引。您不需要指定索引。这已经完成了,因为它是一个代表。

Repeater{
    model: sysinfo.coreUtilizationsInPercent.length

    delegate: CoreUtilizationDisplay{
        width: root.elementWidth
        height: root.elementHeight
        fontSize: root.fontSize

        progressBarColor: "#3399FF" // blue
        minMaxTextColor: "blue"

        core: index + 1
        value: sysinfo.coreUtilizationsInPercent[index]
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息可以在文档中找到

  • 今天我遇到了同样的问题。我认为这种行为并不直观。 (3认同)