QML - Как получить детей в предмет? - PullRequest
0 голосов
/ 04 апреля 2019

У меня была проблема с элементом в QML. Я хочу получить детей от предмета, но, кажется, он работает с первым элементом.

Код детали ниже:

У меня есть сетка с пользовательским компонентом списка AAA_Styles

GridView{
    id: grdViewDeviceControl
    clip: true
    interactive: true
    ScrollIndicator.vertical: ScrollIndicator{}
    cellWidth: 200
    cellHeight: 300

    model: ListModel{}

    delegate: Item {
        width: grdViewDeviceControl.cellWidth
        height: grdViewDeviceControl.cellHeight
        AAA_Styles{
            id: deviceControl
            objectName: "deviceControl"
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.verticalCenter: parent.verticalCenter
            name: Names
            subname: Subnames
    }
}

Мой пользовательский AAA_RTS - это QML компонент, имеющий некоторые функции , такие как:
- function_a ()
- function_b ()
Я добавил 2 модели в модель, используя

grdViewDeviceControl.model.append ()

Я гарантирую, что в модели есть данные, которые я добавил, потому что они появились в моем дизайне, а количество значений gridview составляет 2 элемента

console.log (grdViewDeviceControl.count) // результат 2

После этого я попытался заставить каждый элемент получить доступ к функциям, которые они доступны, используя метод в сигнале onRelease кнопки:

onReleased: {
    console.log("number of item: " + grdViewDeviceControl.count)
    var myRTS = grdViewDeviceControl.contentItem.children[0]
    console.log(myRTS)
    console.log(myRTS.children[0])
    myRTS = grdViewDeviceControl.contentItem.children[1]
    console.log(myRTS)
    console.log(myRTS.children[1])
}

Результат на консоли:

qml: номер элемента: 2
qml: QQuickItem (0x9828f60)
qml: AAA_Styles_QMLTYPE_0_QML_112 (0x9829070, "deviceControl")
qml: QQuickItem (0x5554140)
qml: undefined

С первым элементом grdViewDeviceControl.contentItem.children [0] , я получаю доступ к function_a или function_b успешно, но когда я использую вторая ошибка появилась

TypeError: Невозможно вызвать метод 'function_a' из неопределенного

Так может кто-нибудь сказать мне, почему я не прав и как это исправить?

Большое спасибо за любую помощь!

1 Ответ

1 голос
/ 10 апреля 2019

Не пытайтесь получить доступ непосредственно к дочерним элементам.Вместо этого используйте идентификаторы делегатов, сигналы и слоты:

  • Дайте «Идентификатор делегата» всем вашим делегатам через модель вашего GridView.
  • В вашем GridView добавьтесигналы, которые будут использоваться для передачи всем делегатам следующих вещей:
    • «Идентификатор делегата» делегата, которому вы хотите, чтобы он выполнял функцию.
    • Аргументы для AAA_Styles function.
  • В свой делегат добавьте один слот для функции AAA_Styles.Каждый слот будет выполнять функцию AAA_Styles, только если широковещательный идентификатор делегата является делегатом: if (broadcastedID === delegateID) { function_ab() }.
  • Когда вы хотите выполнить function_a() или function_b() в делегате, передайте идентификатор делегата иаргументы функции через соответствующий сигнал GridView (например, onReleased).

Следующий фрагмент кода подводит итог тому, что я только что описал вам.Если это не работает, поместите делегат в отдельный файл QML.Это должно работать хорошо:

// Your grid
GridView {
    id: grdViewDeviceControl
    clip: true
    interactive: true
    ScrollIndicator.vertical: ScrollIndicator {}
    cellWidth: 200
    cellHeight: 300

    model: ListModel {
        /*
            Example of list element:
            ListElement { m_uuid: "{element-uuid}" }
        */
    }

    delegate: Item {
        width: grdViewDeviceControl.cellWidth
        height: grdViewDeviceControl.cellHeight

        AAA_Styles {
            id: deviceControl
            objectName: "deviceControl"
            anchors.centerIn: parent
            name: Names
            subname: Subnames
        }

        // The delegate ID
        property string delegate_id: m_uuid

        // Broadcast receivers
        function delfunc_a(uuid, argA0) {
            if (uuid === this.delegate_id) {
                deviceControl.function_a(argA0)
            }
        }

        function delfunc_b(uuid, argB0, argB1) {
            if (uuid === this.delegate_id) {
                deviceControl.function_b(argB0, argB1)
            }
        }

        // Connecting broadcasters to receivers
        Component.onCompleted: {
            grdViewDeviceControl.exec_a.connect(this.delfunc_a)
            grdViewDeviceControl.exec_b.connect(this.delfunc_b)
        }

        Component.onDestruction: {
            grdViewDeviceControl.exec_a.disconnect(this.delfunc_a)
            grdViewDeviceControl.exec_b.disconnect(this.delfunc_b)
        }
    }

    // Your broadcasters
    signal exec_a(string uuid, int argA0)
    signal exec_b(string uuid, bool argB0, string argB1)
}
// Somewhere else in your code:
onReleased: {
    /*
     * Only the delegate whose ID is "{a-given-uuid}"
     * will execute deviceControl.function_a(3):
     */
    grdViewDeviceControl.exec_a("{a-given-uuid}", 3)
    /*
     * Only the delegate whose ID is "{another-given-uuid}"
     * will execute deviceControl.function_b(true, "U got style!"):
     */
    grdViewDeviceControl.exec_b("{another-given-uuid}", true, "U got style!")
}
...