Russian Qt Forum

Qt => Qt Quick => Тема начата: NKovalev64 от Май 20, 2014, 22:54



Название: QML QTableView
Отправлено: NKovalev64 от Май 20, 2014, 22:54
Есть с++ модель (от QAbstractItemModel) в qml представлении QTableView. В модели 3 роли, 2 из них отображены в таблице, а третья должна быть отображена в отдельном элементе по клику на соответствующую ячейку таблицы.

TableView {
   id: tableView
   model: myModel
   TableViewColumn{ role: "role1"  ; title: "qwerty" ; width: 200 }
   TableViewColumn{ role: "role2"  ; title: "qwerty" ; width: 200 }

   onClicked: {
      textArea.text = ???
   }
}

TextArea {
   id:textArea
}

Как сделать, чтобы по клику на ячейку таблицы, в textArea записывалось содержимое модели с ролью "role3"?

Примерно того что нужно показан здесь:
http://www.youtube.com/watch?v=_6_F6Kpjd-Q#t=600
Только там XmlListModel, а у меня с++ модель.


Название: Re: QML QTableView
Отправлено: navrocky от Май 24, 2014, 18:47
Сделай у модели метод, выдающий строку в виде JS-объекта:

Код:
Q_INVOKABLE QVariantMap getRow(int row);

Код:
var o = model.getRow(listView.currentIndex);
label.text = o.title;

Я не нашел более нормального способа из JS доступаться к модели. В моем случае модель хранила данные именно в QVariantMap, и у меня никакого оверхэда не возникло )

Также если ты объявлял константы ролей в модели, а ты скорее всего это сделал, то можно этот enum пробросить в QML и сделать метод, возвращающий QVariant в зависимости от роли.

Код:
Q_INVOKABLE QVariant getRowValue(MyModelRole role, int row);

Код:
label.text = model.getRowValue(MyModel.Title, listView.currentIndex);


Название: Re: QML QTableView
Отправлено: NKovalev64 от Май 25, 2014, 21:10
Сделай у модели метод, выдающий строку в виде JS-объекта:

Код:
Q_INVOKABLE QVariantMap getRow(int row);

Код:
var o = model.getRow(listView.currentIndex);
label.text = o.title;



Я не нашел более нормального способа из JS доступаться к модели. В моем случае модель хранила данные именно в QVariantMap, и у меня никакого оверхэда не возникло )

Также если ты объявлял константы ролей в модели, а ты скорее всего это сделал, то можно этот enum пробросить в QML и сделать метод, возвращающий QVariant в зависимости от роли.

Код:
Q_INVOKABLE QVariant getRowValue(MyModelRole role, int row);

Код:
label.text = model.getRowValue(MyModel.Title, listView.currentIndex);

Я пока что именно так и сделал - создал в модели новый метод. Но ведь это же ужасный костыль! Есть метод data() и он уже умеет возвращать значения ячеек модели в соответсвии с заданной ролью. Так что продолжаю поиск более оптимального способа.