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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [QML] Отловить момент обновления вьюхи и получить pixmap  (Прочитано 3258 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Февраль 08, 2017, 10:52 »

Всем привет.

Возникла задача "грабить" вьюху приложения на QML.

В старом добром, теплом, ламповом, растровом Qt с плюсами для этого достаточно
было переопределить метод paintEvent() и делай что хочешь - и оно не тормозило.

Но в QML ничего не работает или оно тормозит жутко, т.к. надо грабить фреймы быстро.

Я знаю что:

1) есть QQuickWindow::grabWindow метод,
   но он не подходит, т.к. медленный.

2) есть QQuickItem::grabToImage метод,
   но он не подходит, т.к. через некоторое время начинают приходить нулевые имиджи, и чем большее
   разрешение мы грабим, тем быстрее оно перестает слать имиджы. Да и медленно также.

3) для определения факта того, что вьюха перерисовалась я использовал сигнал
   QQuickWindow::afterRendering,
   но оно вызывается из потока рендера, и, может по этой причине останавливаются имиджы
   из п.2. Да и медленно также.

Может кто сталкивался, можно ли быстро отловить момент "перерисовки" вьюхи с быстренько
сграбить его картинку при использовании QML? А то прямо беда-печаль какая-то.

Было бы очень здорово, если бы, к примеру можно было бы получать только изменившийся
рект, а не рект всей вьюхи (например, как могет QGraphicsScene делать более менее).
« Последнее редактирование: Февраль 08, 2017, 10:55 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Отражение луны
Гость
« Ответ #1 : Февраль 08, 2017, 23:18 »

Не силен в cpp, но насколько мне известно это делается через фреймбуффер. Полагаю,
http://doc.qt.io/qt-5/qquickwindow.html#renderTarget
http://doc.qt.io/qt-5/qopenglframebufferobject.html#toImage
Не претендую на оригинальность и работоспособность совета, надеюсь, это как-то поможет.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Февраль 09, 2017, 09:46 »

Не, это уже испробовано. Я забыл упомянуть об этом.

Суть в том, что по умолчанию renderTarget() пуст (нулевой указатель), а внутри вся отрисовка ведется по умолчанию в окно.
Но если мы установим свой таргет через setRenderTarget(QOpenGLFramebufferObject *obj), то, да - оно будет рисоваться..
но не в окно а в тот заданый объект. Само же окно будет черным. Вот если бы можно было "распараллелить" отрисовку и
туда и сюда...
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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