Обязательное свойство не работает с повторителем - PullRequest
1 голос
/ 20 июня 2020

У меня есть такой компонент:

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

//....
}

Теперь я подумал, что было бы неплохо сделать некоторые необходимые свойства, поскольку они должны быть объявлены при использовании компонента. Поэтому я изменил его на:

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

//....
}

Компонент вызывается в репитере, как это:

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]
        }
    }
}

Теперь это работает нормально, пока я не сделаю требуемые свойства. Интересно, почему это не работает?

Если я объявляю, что это необходимо, я получаю эту ошибку:

qrc:/qml/SystemInformationDisplay.qml:57: ReferenceError: index is not defined

Я сделал то же самое с аналогичными компонентами, которых нет в репитере, и там он работает нормально.

Почему?

1 Ответ

1 голос
/ 12 августа 2020

Из блога qt develop

И если ваши делегаты не содержат требуемых свойств, здесь ничего не меняется. Однако, если они содержат хотя бы одно обязательное свойство, эти имена больше не доступны. Вместо этого вы должны явно согласиться, указав их как обязательные свойства.

В этом случае вам нужно добавить в компонент индекс необходимого свойства.

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

//....
}

С этим дополнительный index, вы можете создать свой компонент и получить доступ к index. Указывать index не нужно. Это сделано, так как это делегат.

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]
    }
}

Более подробную информацию можно найти в документации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...