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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: OpenGL+WebKit - нужен совет  (Прочитано 5538 раз)
UnSeen
Гость
« : Сентябрь 19, 2011, 16:43 »

Задача в следующем: требуется создать приложение, отображающее трёхмерную графику с помощью OpenGL, поверх которой рисуется веб-содержимое.
После непродолжительных поисков обнаружил что это, вероятно, можно легко реализовать на Qt. Возможно даже несколькими способами.
Но чуть более продолжительные поиски не дали точных результатов Улыбающийся Примеров именно того, что мне требуется, найти не удалось.
Возможно вы подскажете, как лучше сделать. Qt никогда не использовал, так что мои знания и представления о нём пока весьма поверхностные.

Может QGraphicsView + QGLWidget + QGraphicWebView ? Если да, то как их связать? Что происходит, когда мы задаём setViewport(new QGLWidget()), каким образом WebView пользуется им и как втиснусть свою отрисовку перед ним? (так чтобы 3d сцена использовась в качестве фона).
Или какие-то другие способы? Может просто один виджет поверх другого (QGLWidget + QWebView)? Но тогда, вероятно, рисование будет происходить менее оптимальным образом - насколько я понимаю, если так вобще можно, они будут рисоваться в разные буферы и потом объединяться.
Ещё какие-нибудь варианты? Плюсы, минусы, подводные камни? ©
Приложение под Windows, если это важно.
WebGL не предлагать Улыбающийся
« Последнее редактирование: Сентябрь 19, 2011, 16:47 от UnSeen » Записан
alexman
Гость
« Ответ #1 : Сентябрь 20, 2011, 08:53 »

Можно попробовать QGraphicsView c viewport QGLWidget. На сцену можно добавить QWebView с помощью QGraphicsProxyWidget * QGraphicsScene::addWidget ( QWidget * widget, Qt::WindowFlags wFlags = 0 ).

Порядок отрисовки элементов задается void QGraphicsItem::setZValue ( qreal z ).

UPDATE: извиняюсь, но
Цитировать
трёхмерную графику
не сразу увидел (так что хз реально ли это таким способом).
« Последнее редактирование: Сентябрь 20, 2011, 08:57 от alexman » Записан
UnSeen
Гость
« Ответ #2 : Сентябрь 20, 2011, 10:51 »

Можно попробовать QGraphicsView c viewport QGLWidget. На сцену можно добавить QWebView с помощью QGraphicsProxyWidget * QGraphicsScene::addWidget ( QWidget * widget, Qt::WindowFlags wFlags = 0 ).
Насколько я понял, можно сразу QGraphicWebView добавить, без прокси. Но дело не в том

UPDATE: извиняюсь, но
Цитировать
трёхмерную графику
не сразу увидел (так что хз реально ли это таким способом).
Ага...
Вопрос в том, куда вклиниться с отрисовкой. Какие-то методы переопределить может быть.
Но чтобы это оптимально сделать, нужно представлять как реализованы эти все Graphics Scene / View / Item, что происходит когда ставится viewport QGLWidget и т.п. Я до этого с Qt дел не имел, а в документации подробности реализации не раскрыты, только как всё должно работать при стандартном использовании. Поэтому нужен совет бывалых Улыбающийся

Мне кажется QGraphicsView c viewport QGLWidget в любом случае будет лучшим вариантом (только я пока не знаю как это сделать) - только так получится рисовать оптимальным способом: сначала трёхмерная сцена, потом в тот_же буфер поверх рисуется WebView. Никаких лишних наложений буферов размером с экран.

С другой стороны, трёхмерная сцена будет обновляться чаще (постоянно, насколько скорости хватает), а содержимое WebView будет меняться гораздо реже. Может быть возможно и имеет смысл как-то рисовать WebView в отдельный буфер (который будет обновляться по мере необходимости - когда произошли изменения), и накладывать его на 3д сцену?

Вобщем куча ламерских вопросов Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 20, 2011, 11:48 »

Цитировать
Может быть возможно и имеет смысл как-то рисовать WebView в отдельный буфер (который будет обновляться по мере необходимости - когда произошли изменения), и накладывать его на 3д сцену?
Можно попробовать такой вариант.
Создать WebView на каком-нибудь виджете и загнать его за пределы экрана, выставить ему setAttribute( Qt::WA_PaintOnScreen ) и сделать его видимым. Повесить на него eventFilter() и следить за QEvent::UpdateRequest. При отработке этого события через WebView::render() получаем, допустим, QImage. Без таких махинаций WebView::update() не будет отрабатывать. Далее рендеришь этот QImage в GL.
Записан

Qt 5.11/4.8.7 (X11/Win)
UnSeen
Гость
« Ответ #4 : Сентябрь 20, 2011, 12:57 »

Кажется, решение найдено!
Ставим QGLWidget на viewport и делаем свою обработку QGraphicsScene::drawBackground(QPainter *painter, const QRectF &rect)
Там уже установлен нужный контекст и можно просто использовать функции OpenGL
Правда придётся на каждом кадре устанавливать заново матрицу проекции (и некоторые другие опции, вероятно), но это уже мелочи
Записан
artiom_kh
Гость
« Ответ #5 : Сентябрь 27, 2011, 12:33 »

можно обойтись и без сцены - у QWebView берется указатель на страницу (метод QWebView::page, возвращает указатель на QWebPage), далее дёргаем QWebPage::setView
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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