QML Java - доступ к элементу делегата из обработчика событий

Как получить доступ к элементу Text.text внутри делегата ListView из обработчика событий для ListView, пример кода (может иметь синтаксические ошибки) ниже.

ListView {
    id: mainLView
    model: ListViewModel {}
    delegate: Rectangle {
      id: theRect
      Text {
         id: theText
         text: ""
      }
    }
    onMovementEnded {
      //here is where I would like to access the text in Text, e.g
      theText.text = "New Value"
    }
}

Код, который у меня есть, не работает, так как текст НЕ доступен из обработчика событий. как мне выполнить настройку текстового значения?

РЕДАКТИРОВАТЬ: Для полноты: я могу добавить элементы в ListView с помощью кода Java (во время загрузки приложения), получить доступ к значениям в ListView внутри события через код, также известный как

mainLView.model.append({'name': "First Value","city":"London"});
var myValue = model.get(currentIndex).city // or name

Но я все еще не могу найти способ присвоения значения делегату Text { text:""}.

РЕДАКТИРОВАТЬ 2 10 июля Вот более полный пример кода того, что я пытаюсь достичь.

ListView {
    id: mainLView
    model: ListModel { id: mainModel}
    delegate: Rectangle {
      id: theRect
      Text {
         id: theText
         text: nameX
      }
    }
    Component.onCompleted: {
        for (var x=1; x < 99; x++) {
            var data = {'nameX': "Name: " + x, "numberX":x};
            mainModel.append(data);
        }
    }
    onMovementEnded {
        //here I want to set the value to numberX e.g (this does not work)
        theText.text = mainView.model.get(currentIndex).numberX
    } 
}

3 ответа

Решение

Учитывая ваши комментарии, я думаю, что следующее может делать то, что вы хотите.

delegate: Rectangle {
      id: theRect
      Text {
         id: theText
         text: mainLView.moving ? nameX : numberX
      }
    }

Это должно отображать одно из значений, когда ListView движется, и другое, когда это не так.

ListView имеет свойство currentItem, которое можно использовать для доступа к элементу с текущим индексом. Чтобы получить доступ к чему-либо из делегата, ваш делегат должен иметь свойство в своем элементе верхнего уровня, так как только те, которые выставлены снаружи. Примерно так должно работать:

ListView {
    id: mainLView
    model: ListModel { id: mainModel}
    delegate: Rectangle {
      property alias text: theText.text
      Text {
         id: theText
         text: nameX
      }
    }

    onMovementEnded {
        mainLView.currentItem.text = "foo";
    } 
}

Чтобы присвоить строковое значение тексту (элементу Text) в представителе списка. Вы можете использовать имя атрибута модели.

как после. здесь имя происходит от Jason object {'name': "First Value","city":"London"});

 delegate: Rectangle {
      id: theRect
      Text {
         id: theText
         text: name // or city
      }
    }

проверьте эту ссылку ( http://kunalmaemo.blogspot.kr/2011/03/creating-custom-listview-delegate-in.html), это поможет.

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

Другие вопросы по тегам