Russian Qt Forum
Ноябрь 23, 2024, 08:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QML QTableView  (Прочитано 3998 раз)
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, а у меня с++ модель.
« Последнее редактирование: Май 21, 2014, 10:17 от NKovalev64 » Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Май 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);
Записан

Гугль в помощь
NKovalev64
Гость
« Ответ #2 : Май 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() и он уже умеет возвращать значения ячеек модели в соответсвии с заданной ролью. Так что продолжаю поиск более оптимального способа.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 23.