crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> MVC. Своя модель и ListView
kibsoft
  опции профиля:
сообщение 27.2.2010, 23:19
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Взял пример написания новой модели из документации и изменил QStringList на QList<Connection*>. Connection - наследник QTcpSocket.

QVariant ConnectionModel::data(const QModelIndex &index, int role) const
{
     if (!index.isValid())
         return QVariant();

     if (index.row() >= peers.size())
         return QVariant();

     if (role == Qt::DisplayRole)
         return peers.at(index.row())->name();//вот тут возвращаю имя пира QString, но в ListView не появляются данные.
     else
         return QVariant();
}


Что неправильно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 27.2.2010, 23:59
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Проблема решена. Нужно было использовать reset() у модели для обновления view.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.2.2010, 7:53
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kibsoft @ 28.2.2010, 2:59) *
Нужно было использовать reset()
эта функция нужна, при массовых изменениях в модели.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 28.2.2010, 13:41
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 28.2.2010, 8:53) *
Цитата(kibsoft @ 28.2.2010, 2:59) *
Нужно было использовать reset()
эта функция нужна, при массовых изменениях в модели.

ну у меня она часто изменяется, добавлением записей в QList. Без Reset() View не обновляется почему-то..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.2.2010, 14:40
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(kibsoft @ 28.2.2010, 13:41) *
ну у меня она часто изменяется, добавлением записей в QList. Без Reset() View не обновляется почему-то..

Потому что не дочитал про модели. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.2.2010, 15:18
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(BRE @ 28.2.2010, 17:40) *
Потому что не дочитал про модели.
угу, раздельчик маленький про изменение размеров модели
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
azure
  опции профиля:
сообщение 26.4.2010, 23:21
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 60
Регистрация: 24.12.2009
Пользователь №: 1332

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 28.2.2010, 15:18) *
Цитата(BRE @ 28.2.2010, 17:40) *
Потому что не дочитал про модели.
угу, раздельчик маленький про изменение размеров модели


А можно поподробнее? Как раз сейчас встала задача такая..
В существующий QList <myclass*> добавляются элементы, при этом соответствующая модель не обновляет QListView. Не совсем понимаю как и в каком виде передается информация об изменении структуры данных к модели и как от модели к виду.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.4.2010, 1:38
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(azure @ 27.4.2010, 3:21) *
при этом соответствующая модель не обновляет QListView
соответствующая, это какая?

Цитата(azure @ 27.4.2010, 3:21) *
Не совсем понимаю как и в каком виде передается информация об изменении структуры данных к модели и как от модели к виду.
методами Model::data и Model::setData
Представление, для каждого элемента данных создаёт делегат (QStyledItemDelegat), если ты сам явно его не установил.
Когда элемент данных (читай делегат) находится в видимой области, он запрашивает данные у модели с помощью Model::data.
Когда элемент данных (читай делегат) переходит в режим редактирования, то делегат создаёт виджет-редактор, который получает данные точно также, только роль данных другая. А при закрытии виджета редактора, последний отправляет данные в модель с помощью Model::setData
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
azure
  опции профиля:
сообщение 27.4.2010, 7:42
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 60
Регистрация: 24.12.2009
Пользователь №: 1332

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 27.4.2010, 1:38) *
Цитата(azure @ 27.4.2010, 3:21) *
при этом соответствующая модель не обновляет QListView
соответствующая, это какая?


Которую я сделал. Сделал subclass от QAbstractListModel, реализовал data() и rowCount. Проверил, data() возвращает непустой QVariant, rowCount() возвращает число строк. И не важно, подключаю я модель к виду пока данных нет, или когда данные появляются - вид остается пустой. Вызовы model->rowCount() и model->data() происходят, значит, вид их вызывает. Возвращаются корректные значения.

Цитата(Litkevich Yuriy @ 27.4.2010, 1:38) *
Цитата(azure @ 27.4.2010, 3:21) *
Не совсем понимаю как и в каком виде передается информация об изменении структуры данных к модели и как от модели к виду.
методами Model::data и Model::setData
Представление, для каждого элемента данных создаёт делегат (QStyledItemDelegat), если ты сам явно его не установил.
Когда элемент данных (читай делегат) находится в видимой области, он запрашивает данные у модели с помощью Model::data.
Когда элемент данных (читай делегат) переходит в режим редактирования, то делегат создаёт виджет-редактор, который получает данные точно также, только роль данных другая. А при закрытии виджета редактора, последний отправляет данные в модель с помощью Model::setData

Вот это я вроде как понимаю. А как вид узнает от модели, что нижележащие данные изменились? Модель, как я понял, должна быть оповещена об изменении данных при помощь setData(), но я не совсем понимаю, как её реализовать. Вы там что-то говорили про "раздельчик маленький про изменение размеров модели". Покажите, где это, что-то не могу найти. Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.4.2010, 11:53
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(azure @ 27.4.2010, 11:42) *
что нижележащие данные изменились?
что значит ниже лежащие?

Вот когда данные в модели изменились, она посылает сигнал dataChanged()
Цитата(azure @ 27.4.2010, 11:42) *
Модель, как я понял, должна быть оповещена об изменении данных при помощь setData(),
не правильно понял, для представления модель и является источником данных, а где она их берёт представлению безразлично. Метод setData() не оповещает модель, а устанавливает данные в ней (что следует из названия метода)

Цитата(azure @ 27.4.2010, 11:42) *
Вы там что-то говорили про "раздельчик маленький про изменение размеров модели". Покажите, где это, что-то не могу найти. Заранее спасибо.
читай всё и не пропустишь соответствующий раздельчик.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 13.11.2018, 5:17