Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ MVC для отбражения изображений

Автор: QBatman 21.7.2009, 12:03

нужно сделать что-то типа вида Thumbnails(эскизы страниц) у explorer'a
т.е. кол-во колонок и строк зависит от размера окна, т.е. при ресайзе прийдётся перестраивать модель, чего делать не хочется.
как правильно сделать?

Автор: ufna 21.7.2009, 12:34

а в чем проблема, т.е. как ты это хочешь реализовывать? Что использовать и т.п.


я делаю через QListWidget, она на автомате менять умеет это все дело.

получаем вот так



а вообще - имхо, правильней перестраивать View, а не модель. Все зависит от того, как ты сам организуешь. В модели я бы сделал просто один столбец и все, а во вью - рисовал уже в зависимости от размера вьювера.

Хотя для многих целей подходит способ с QListView/Widget (первое - если не открываешь папку с тяжелыми файлами, второе - если нужно писать более реальное, имхо)

Автор: mozgofil 21.7.2009, 21:53

Цитата(ufna @ 21.7.2009, 12:34) *
а вообще - имхо, правильней перестраивать View, а не модель. Все зависит от того, как ты сам организуешь. В модели я бы сделал просто один столбец и все, а во вью - рисовал уже в зависимости от размера вьювера.

действительно, но делать особо ничего не надо:
Цитата
flow : Flow

This property holds which direction the items layout should flow.

If this property is LeftToRight, the items will be laid out left to right. If the isWrapping property is true, the layout will wrap when it reaches the right side of the visible area. If this property is TopToBottom, the items will be laid out from the top of the visible area, wrapping when it reaches the bottom.

т.е. использовать QListView -верная мысль

Автор: ufna 21.7.2009, 23:01

Единственное, проблема QListView - использование для предпросмотра реальных файлов приводит к тому, что удобнейшие вещи, такие как QDirModel, отпадают в использовании, т.к. они работают в том же потоке, что и гуи, т.е. открывая папку с фотками, получаем конкретный завис приложения (делаем свой IconProvider). В этом случае можно обойтись конечно написав ридер thumbnail'ов системных (могу поделиться либой для винды ХР, если кому надо), но это строго привязано к платформе (на том же KDE процесс чтения иконок очень прост, а на винде - гемморой еще тот, учитывая что в ХР и Висте разные схемы абсолютно).

Я сам обошел сию ситуацию через использование QListWidget и второго потока, который аккуратно читает изображения, и потихоньку пихает их в сий виджет, т.е. изначально заполняется виджет "пустышками" с названием, а далее уже идет загрузка фоток.

Автор: ViGOur 21.7.2009, 23:10

Цитата(ufna @ 22.7.2009, 0:01) *
могу поделиться либой для винды ХР, если кому надо
Если не лень выложи исходник с описанием на сайте, кому-нибудь да пригодится...
Зайди на crossplatform.ru и так как ты залогинен на форуме, то ты уже залогинен на сайте, соответственно можешь создать статью в разделе исходники (Создать материал) и прикрепить исходник здесь (пока здесь, поже сделаю возможность прикрепления на сайте). Если что-то не получится пиши мне, помогу или исправлю...

Автор: Litkevich Yuriy 22.7.2009, 4:04

Цитата(ufna @ 22.7.2009, 3:01) *
такие как QDirModel, отпадают в использовании, т.к. они работают в том же потоке, что и гуи,
если ты их там создаёшь.

Автор: ufna 22.7.2009, 8:22

Цитата
Если не лень выложи исходник с описанием на сайте, кому-нибудь да пригодится...


Вечером выложу :)


Цитата(Litkevich Yuriy @ 22.7.2009, 5:04) *
если ты их там создаёшь.


т.е. модель и представление могут спокойно жить в разных потоках? Не знал :)

Сам я с потоками редко работал, и в основном не Qt.

Для конретно приведенного примера правда все равно геммороя с QDirModel больше, имхо. Про возможность использования разных потоков не знал, углубляться в модицифирование не стал. QDirModel в своем изначальном состоянии будет грузить директорию "по одному", т.е. опячть же папка с фотками будет очень долго вся загружаться (при использование нового IconProvidera, который как бы сии иконки и грузит), не давая изначального превью хотя бы количества файлов.

Автор: Litkevich Yuriy 22.7.2009, 8:27

Цитата(ufna @ 22.7.2009, 12:22) *
т.е. модель и представление могут спокойно жить в разных потоках? Не знал
модель не наследник QPaintDevice поэтому может жить в отдельном от GUI потоке

Автор: ufna 22.7.2009, 8:36

Цитата(Litkevich Yuriy @ 22.7.2009, 9:27) *
модель не наследник QPaintDevice поэтому может жить в отдельном от GUI потоке


хм, как то не подумал, спасибо :)

Автор: mozgofil 22.7.2009, 18:30

Цитата(ufna @ 21.7.2009, 23:01) *
Единственное, проблема QListView - использование для предпросмотра реальных файлов приводит к тому, что удобнейшие вещи, такие как QDirModel, отпадают в использовании, т.к. они работают в том же потоке, что и гуи, т.е. открывая папку с фотками, получаем конкретный завис приложения (делаем свой IconProvider). В этом случае можно обойтись конечно написав ридер thumbnail'ов системных (могу поделиться либой для винды ХР, если кому надо), но это строго привязано к платформе (на том же KDE процесс чтения иконок очень прост, а на винде - гемморой еще тот, учитывая что в ХР и Висте разные схемы абсолютно).

Вот только не надо мух с котлетами путать:
QListView не виноват что модель тормозит.
Нужно просто сделать модель, которая будет изображения подгружать в отдельном потоке.

Автор: ufna 22.7.2009, 18:47

А я где-то говорил что это виноват QListView? Собственно, смотри выше, я уже писал что сделал через второй поток, только основываясь на QListWidget, т.к. на мой взгляд это легче и оправданней в контексте моего приложения. Модель тоже можно модифицировать, тут как удобнее. Я только говорю о том, что придется на этот предмет немного заморочится, вот и все.

Автор: Litkevich Yuriy 22.7.2009, 18:54

Цитата(ufna @ 22.7.2009, 22:47) *
что сделал через второй поток, только основываясь на QListWidget
собственно посмотри что получилось, QListWidget - это QListView со встроенной моделью.
Т.е. и получается, что можно немного модифицировать и получишь:
QListView + собственная "модель в доппотоке", либо "модель использующая доппоток".

Автор: ufna 22.7.2009, 18:57

да, согласен :) просто не знал что модель и вью могут в разных потоках жить.

вариантов то множество :)

Автор: mozgofil 22.7.2009, 20:41

Цитата(ufna @ 22.7.2009, 18:47) *
А я где-то говорил что это виноват QListView?

говорил:)

Кстати, "модель использующая доппоток" будет иметь приемущество в скорости если данные в View передавать ч/з указатель

Автор: mozgofil 23.7.2009, 19:44

неплохой фичей было бы отображать изображение в родном для ОСи вьювере
например при 2йном щелчке по изображению.
Кто знает, как запустить вьювер из Qt?

Автор: Litkevich Yuriy 23.7.2009, 19:53

Цитата(mozgofil @ 23.7.2009, 23:44) *
Кто знает, как запустить вьювер из Qt?
см. bool QDesktopServices::openUrl ( const QUrl & url ) [static]

Автор: mozgofil 23.7.2009, 21:36

Спасибо!

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)