Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: TheMixa от Август 23, 2010, 07:56



Название: Как отловить видимость виджета?
Отправлено: TheMixa от Август 23, 2010, 07:56
Подскажите возможноли решить следующую задачу таким образом.

Есть QScrollWidget, в нем в куча (до 500 шт) изображений(производное от QLabel) размера A4 сгруппированых в vbox. Так вот когда колво изображений велико(например 80) если загружать туда их циклом то получается медленно, вроде простое решение загружать их отдельным процессом тем самым пользователь начнет работать сразу, токже поступить и с масштабированием. Но вся проблема в том что не каждый офисный компьютер это пережует спокойно.

Надумал такое решение: отлавливать фактическую видимость изображения(qlabel)  в scrollwidget и тем самым загружать/перерисовыват при необходимости. Но как это сделать? paintEvent() сработает только тогда когда надо реально перерисовать, например измениятся геометрия scrollwidget. Есть ли возможность?

Или может есть идеи как сделать это эффективнее чтобы не перерисовывать все изображения в фоне сразу например при изменении масштаба или загрузке?


Название: Re: Как отловить видимость виджета?
Отправлено: Авварон от Август 23, 2010, 08:33
не процесс, а поток. И бояться потоков не надо, если вам так страшно, можете приоритет понизить.


Название: Re: Как отловить видимость виджета?
Отправлено: TheMixa от Август 23, 2010, 09:28
с потоками на qt еще не работал, походу придется.

вспринципе paintEvent подходит для этого но слишком рваный скрол получается да и срабатывает он на каждый чих
Код:
if(loadstate != 1) {
        if(loadstate == 0) {
            QLabel::paintEvent(event);
        }
        else {
            loadstate = 0;
            showPage(currentPage);
        }
    }
    else
        loadstate = 2;


Название: Re: Как отловить видимость виджета?
Отправлено: TheMixa от Август 23, 2010, 10:09
отвечу всам себе вдруг кому пригодится.

Проблему рваности скрола решил так:  при первой загрузке изображения за место него отресовывается пустой пиксмап аналогичного размера, а далее по приведенной выше логике в paintEvent на второй раз рисуется оригинал.

недостатком является то что если на стартовом экране больше одной картики помещается(не мой случай) то отрисуется только первая а остальные будут пустыми.


Название: Re: Как отловить видимость виджета?
Отправлено: GreatSnake от Август 23, 2010, 11:32
Получаем размер картинки через QImageReader::size()
и задействуем QGraphicsScene/QGraphicsView/QGraphicsRectItem's.
Грузим картинку непосредственно перед первой отрисовкой в QGraphicsRectItem::paint().
Рекомендую использовать QImage вместо QPixmap.