Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Swa от Февраль 28, 2013, 09:22



Название: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 09:22
Всем привет.
Есть набор данных, которые отображаются в модели, каждый элемент имеет свою иконку. Все иконки хранятся в ресурсах приложения, а объект хранит текстовый идентификатор иконки(имя).
Вопрос в том, как лучше возвращать эту иконку:
так
Код:
QHash<QString, QPixmap> icons;
...
QVariant Model::data(int role) const {
if (role == Qt::DecorationRole)
    return icons[iconName];
}
или так
Код:
QVariant Model::data(int role) const {
if (role == Qt::DecorationRole)
    return new Pixmap(iconName, "PNG");
}


Название: Re: Возврат иконки из модели
Отправлено: Old от Февраль 28, 2013, 09:31
Вопрос в том, как лучше возвращать эту иконку:
или так
Код:
QVariant Model::data(int role) const {
if (role == Qt::DecorationRole)
    return new Pixmap(iconName, "PNG");
}
При каждой отрисовке строки загружать заново картинку?


Название: Re: Возврат иконки из модели
Отправлено: Bepec от Февраль 28, 2013, 09:49
Всё хуже :D не загружать новую, а выделять под неё место :D

Истинно адский код :D

PS первый вариант нравится больше :D


Название: Re: Возврат иконки из модели
Отправлено: Old от Февраль 28, 2013, 10:14
Всё хуже :D не загружать новую, а выделять под неё место :D
От утечки легко можно уйти. А вот загружать ее заново, даже из ресурсов, при каждой отрисовке строки очень накладно.


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 10:41
А вот загружать ее заново, даже из ресурсов, при каждой отрисовке строки очень накладно.
Вы правы, только что проверил, метод вызывается при каждой отрисовке. Я думал, там как-то более экономно сделано.


Название: Re: Возврат иконки из модели
Отправлено: Bepec от Февраль 28, 2013, 10:48
Сделал то ты  ;)


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 11:04
Что сделал я?


Название: Re: Возврат иконки из модели
Отправлено: GreatSnake от Февраль 28, 2013, 11:51
Я думал, там как-то более экономно сделано.
Где "там"? Ведь это твой код ???


Название: Re: Возврат иконки из модели
Отправлено: Igors от Февраль 28, 2013, 11:53
Используйте QPixmapCache


Название: Re: Возврат иконки из модели
Отправлено: GreatSnake от Февраль 28, 2013, 11:56
Используйте QPixmapCache

Дык у него уже есть свой:
Код:
QHash<QString, QPixmap> icons;


Название: Re: Возврат иконки из модели
Отправлено: Igors от Февраль 28, 2013, 12:10
Дык у него уже есть свой:
Код:
QHash<QString, QPixmap> icons;
Ну тоже можно, только ж надо его корректно пополнять


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 12:22
Я имею в виду, что view вызывает QAbstractItemModel::data (QModelIndex &, int role) каждый раз при перерисовке, а могла бы кешировать эти данные и запрашивать только когда они изменились. Но это я просто мечтаю.


Название: Re: Возврат иконки из модели
Отправлено: GreatSnake от Февраль 28, 2013, 12:24
Я имею в виду, что view вызывает QAbstractItemModel::data (QModelIndex &, int role) каждый раз при перерисовке, а могла бы кешировать эти данные и запрашивать только когда они изменились. Но это я просто мечтаю.
Интересно на основании чего в твоём случае модель решит, что данные изменились ???
Ведь модель понятия не имеет про данные, ибо ты их в модель не помещаешь в данном случае вовсе.


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 12:44
Я имел в виду, что view мог бы кешировать эти данные, а обновлять при получении сигнала QAbstractItemModel::dataChanged.


Название: Re: Возврат иконки из модели
Отправлено: GreatSnake от Февраль 28, 2013, 12:46
Я имел в виду, что view мог бы кешировать эти данные, а обновлять при получении сигнала QAbstractItemModel::dataChanged.
Мде... как всё запущено. Ещё раз и внимательно читай мой пост выше.


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 13:04
И что же запущено? Если я сказал что-то глупое, то объясните хотя-бы в двух словах.

Ещё раз и внимательно читай мой пост выше.

Есть кастомный класс, унаследованный от QAbstractItemModel и когда реальные данные изменяются, этот сигнал высылается явно (emit dataChanged (...)).


Название: Re: Возврат иконки из модели
Отправлено: Bepec от Февраль 28, 2013, 13:17
Ты данные модели суёшь извне. Из своего кеша картинок. Каким манером он узнает что они изменились? :)


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 13:28
Данные - набор объектов класса, унаследованного от QObject. Юзер меняет иконку, объект высылает сигнал iconChanged, модель на него подписана.


Название: Re: Возврат иконки из модели
Отправлено: GreatSnake от Февраль 28, 2013, 13:39
Цитата: assistant
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) [signal]
This signal is emitted whenever the data in an existing item changes.
Ты через QAbstractItemModel::setData( index, icon, Qt::DecorationRole ) в ячейку модели поместил иконку?
Нет! Дык с чего модель будет испускать сей сигнал ???


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 13:43
Данные в модель не помещаются вообще.
Код:
QObject::connect(item, SIGNAL(iconChanged(Item*)), this, SLOT(ItemDataChanged(Item*)));
...
MyModel::ItemIconChanged(Item*) {
  emit dataChanged(QModelIndex(...), QModelIndex(...));
}


Название: Re: Возврат иконки из модели
Отправлено: GreatSnake от Февраль 28, 2013, 13:52
Всё понятно. Только вот вью данные отображает, а не хранит.
В итоге данные никто не хранит, но тем не менее автор хочет, чтобы кто-то их кешировал.
Отсюда вывод - сам построил такую систему - сам и делай кеширование)


Название: Re: Возврат иконки из модели
Отправлено: Swa от Февраль 28, 2013, 14:02
Это я понимаю теперь. ;)