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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отловить видимость виджета?  (Прочитано 2764 раз)
TheMixa
Гость
« : Август 23, 2010, 07:56 »

Подскажите возможноли решить следующую задачу таким образом.

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

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

Или может есть идеи как сделать это эффективнее чтобы не перерисовывать все изображения в фоне сразу например при изменении масштаба или загрузке?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Август 23, 2010, 08:33 »

не процесс, а поток. И бояться потоков не надо, если вам так страшно, можете приоритет понизить.
Записан
TheMixa
Гость
« Ответ #2 : Август 23, 2010, 09:28 »

с потоками на qt еще не работал, походу придется.

вспринципе paintEvent подходит для этого но слишком рваный скрол получается да и срабатывает он на каждый чих
Код:
if(loadstate != 1) {
        if(loadstate == 0) {
            QLabel::paintEvent(event);
        }
        else {
            loadstate = 0;
            showPage(currentPage);
        }
    }
    else
        loadstate = 2;
« Последнее редактирование: Август 23, 2010, 09:33 от TheMixa » Записан
TheMixa
Гость
« Ответ #3 : Август 23, 2010, 10:09 »

отвечу всам себе вдруг кому пригодится.

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

недостатком является то что если на стартовом экране больше одной картики помещается(не мой случай) то отрисуется только первая а остальные будут пустыми.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Август 23, 2010, 11:32 »

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

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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