Различные делегаты для QML ListView

Несмотря на отсутствие риска безопасности данных , это абсолютно опасный риск безопасности бизнес-аналитики , поскольку он предоставляет как размер данных, так и скорость. Я видел, как предприятия получают от этого вред и написали об этом анти-шаблоне в глубину. Если вы просто не строите эксперимент, а не бизнес, я бы настоятельно предложил сохранить ваши личные идентификаторы вне поля зрения общественности. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e

17
задан BaCaRoZzo 13 August 2015 в 16:58
поделиться

5 ответов

Я считаю, что было бы лучше реализовать один базовый делегат для всех видов position, который загружает конкретную реализацию в зависимости от position или любых других свойств данных, используя Loader

BaseDelegate {
    property var position

    Loader {
        sourceComponent: {
            switch(position) {
                case "Engineer": return engineerDelegate
            }
        }
    }

    Component {
        id: engineerDelegate
        Rectangle {
             Text {  }
        }
    }
}
11
ответ дан Andrii 13 August 2015 в 16:58
поделиться

Поскольку у вас есть только два типа, следующий код так же легко поддерживать и легко понять:

delegate: Item {
    Employee { visible = position === "Engineer" }
    Manager { visible = position === "Manager" }
}

В случае, если число типов будет расти, это не подходящее решение для это легко приводит к адскому утверждению if.

0
ответ дан skypjack 13 August 2015 в 16:58
поделиться

Конечно, это возможно. ListView.delegate является своего рода указателем на Component, который будет рисовать элементы, чтобы вы могли их изменить.

Например:

Employee { id: delegateEmployee }
Manager { id: delegateManager}
...
ListView {  
    property string position   
    delegate: position == "Engineer" ? delegateEmployee : delegateManager
}
-1
ответ дан folibis 13 August 2015 в 16:58
поделиться

Я реализовал это следующим образом:

ListView {
    id: iranCitiesList
    model: sampleModel
    delegate: Loader {
        height: childrenRect.height
        width: parent.width
        sourceComponent: {
            switch(itemType) {
            case "image" :
                return imageDel;
            case "video":
                return videoDel;
            }
        }
    }
    ImageDelegate { id: imageDel }
    VideoDelegate { id: videoDel }
}


ImageDelegate.qml

Component {
    Image { /*...*/ }
}


VideoDelegate.qml

Component {
    Item { /*....*/ }
}

Последнее примечание, проверьте ширину и высоту делегатов. В моем случае мне пришлось снова установить ширину и высоту моего делегата в Loader.
Удачи - Мусави

8
ответ дан S.M.Mousavi 13 August 2015 в 16:58
поделиться

У меня была та же проблема, документация Qt дает довольно хороший ответ: http://doc.qt.io/qt-5/qml-qtquick-loader.html#using-a- loader-Within-a-view-делегат

Самым простым решением является встроенный Component с Loader для установки файла source:

ListView {
    id: contactsView
    anchors.left: parent.left
    anchors.top: parent.top
    width: parent.width
    height: parent.height
    orientation: Qt.Vertical
    spacing: 10
    model: contactsModel
    delegate: Component {
        Loader {
            source: switch(position) {
                case "Engineer": return "Employee.qml"
                case "Manager": return "Manager.qml"
            }
        }
    }
}

Any попытка использовать Loader.srcComponent приведет к отсутствию какой-либо переменной в модели (включая index). Единственный способ присутствия переменных - это дочерние элементы Component находиться внутри основного Component, но тогда может присутствовать только один, поэтому это бесполезно.

14
ответ дан Mohammad Kanan 13 August 2015 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: