Как прочитать пользовательское свойство родительского ListView из внешнего делегата? - PullRequest
1 голос
/ 22 января 2020

У меня ListView и его делегат определены в другом qml-файле.

main.qml:

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480

    ListModel {
        id: listModel
        ListElement {
            name: "Bill Smith"
        }
        ListElement {
            name: "John Brown"
        }
        ListElement {
            name: "Sam Wise"
        }
    }

    ListView {
        width: 180; height: 200
        property color delegateColor: "green"

        model: listModel
        delegate: ExternalDelegate {}
    }
}

ExternalDelegate.qml:

import QtQuick 2.12
import QtQuick.Controls 2.12

ItemDelegate {

    background: Rectangle {
        color: ListView.view.delegateColor
    }

    Text {
        text: model.name
    }
}

Parent ListView имеет пользовательское свойство DelegateColor. Мне нужно прочитать это свойство от делегата. Но если я пытаюсь получить к нему доступ с помощью прикрепленного свойства ListView.view, он не работает. И я вижу сообщения в консоли:

qrc:/ExternalDelegate.qml:7: TypeError: Cannot read property 'delegateColor' of null

Как прочитать пользовательское свойство ListView из внешнего делегата?

Мне нужно установить это свойство в ListView (не в делегат), потому что я также хочу получить доступ к этому свойству из делегатов заголовка, нижнего колонтитула и раздела.

1 Ответ

3 голосов
/ 22 января 2020

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

import QtQuick 2.12
import QtQuick.Controls 2.12

ItemDelegate {
    id: root
    property alias color: bg.color
    background: Rectangle {
        id: bg
    }
    contentItem: Text {
        text: root.text
    }
}
delegate: ExternalDelegate {
    text: model.name
    color: ListView.view.delegateColor
}

Другое решение - изменить псевдоним только для нового свойства:

import QtQuick 2.12
import QtQuick.Controls 2.12

ItemDelegate {
    id: root
    property color color : "white"
    background: Rectangle {
        color: root.color
    }
    contentItem: Text {
        text: root.text
    }
}
...