QML Как вызвать метод модели из делегата - PullRequest
1 голос
/ 09 июля 2020

У меня есть простая программа QML, в которой есть ListView. Модель и делегат ListView определены в отдельных файлах QML.

//Main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
//import TheModel.qml
//import TheDelegate.qml


Window {
    id: window
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView {
        anchors.fill: parent
        model: theModel
        delegate: theDelegate
        focus: true

    }
    Button{
        x: 394
        y: 257
        text: "press me"
       onPressed: theModel.append({"color":"black", "cost": 5.95, "name":"Pizza"})
   }

    TheDelegate{
        id: theDelegate
    }

    TheModel{
        id:theModel
    }
}

, затем файл модели

//TheModel.qml
import QtQuick 2.0

ListModel{
    ListElement {
        color:"red";
        name: "Bill Smith"
        number: "555 3264"
    }
    ListElement {
        color:"blue";
        name: "John Brown"
        number: "555 8426"
    }
    ListElement {
        color:"green";
        name: "Sam Wise"
        number: "555 0473"
    }
}

и, наконец, делегат

    //TheDelegate.qml
    import QtQuick 2.0
    
    Component {
        Rectangle{
            color: model.color
            width: 100
            height: 100
            MouseArea{
                anchors.fill: parent
                onPressed: model.append({"color":"black", "cost": 5.95, "name":"Pizza"})
            }
        }
    }

, если я нажму на делегате MouseArea метод onPressed должен будет создать один ListItem, но проблема в том, что я не могу получить доступ к функции модели из делегата. что сбивает с толку, доступ к свойствам осуществляется в делегате через model. может ли кто-нибудь указать на правильный способ сделать это, скажем, если я знаю, что модель - это ListModel и у нее есть метод append, но делегат этого не знает, есть ли способ привести модель к известному типу затем вызвать его метод?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Объект модели предоставляется каждому делегату в представлении и предоставляет данные модели для этого конкретного делегата. Это не то же самое, что свойство модели ListView.

Подход @ Amfasis хорош, потому что он будет работать с любым типом модели и представления.

Если вы не против привязать делегировать ListView, вы можете использовать прикрепленный ListView API:

Component {
    Rectangle{
        id: root
        color: model.color
        width: 100
        height: 100
        MouseArea{
            anchors.fill: parent
            onPressed: root.ListView.view.model.append({"color":"black", "cost": 5.95, "name":"Pizza"})
        }
    }
}
1 голос
/ 09 июля 2020

Это можно сделать, добавив сигнал в TheDelegate, который вы можете подключить в области, где доступен theModel. Я бы назвал это «содержащимися компонентами», вероятно, для этого есть какой-то причудливый термин; -)

Пожалуйста, измените TheDelegate.qml на (кстати, я также изменил его, чтобы он не был Component, для повторного использования):

import QtQuick 2.0

Rectangle{
    color: model.color
    width: 100
    height: 100

    signal appendRequested(var newItem)

    MouseArea{
        anchors.fill: parent
        onPressed: appendRequested({"color":"black", "cost": 5.95, "name":"Pizza"})
    }
}

Затем в main.qml вы можете использовать его следующим образом:

ListView {
    anchors.fill: parent
    model: theModel
    delegate: theDelegate

    focus: true
}

Component {
    id: theDelegate

    TheDelegate {
        onAppendRequested: theModel.append(newItem)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...