Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: UnSeen от Сентябрь 19, 2011, 16:43



Название: OpenGL+WebKit - нужен совет
Отправлено: UnSeen от Сентябрь 19, 2011, 16:43
Задача в следующем: требуется создать приложение, отображающее трёхмерную графику с помощью OpenGL, поверх которой рисуется веб-содержимое.
После непродолжительных поисков обнаружил что это, вероятно, можно легко реализовать на Qt. Возможно даже несколькими способами.
Но чуть более продолжительные поиски не дали точных результатов :) Примеров именно того, что мне требуется, найти не удалось.
Возможно вы подскажете, как лучше сделать. Qt никогда не использовал, так что мои знания и представления о нём пока весьма поверхностные.

Может QGraphicsView + QGLWidget + QGraphicWebView ? Если да, то как их связать? Что происходит, когда мы задаём setViewport(new QGLWidget()), каким образом WebView пользуется им и как втиснусть свою отрисовку перед ним? (так чтобы 3d сцена использовась в качестве фона).
Или какие-то другие способы? Может просто один виджет поверх другого (QGLWidget + QWebView)? Но тогда, вероятно, рисование будет происходить менее оптимальным образом - насколько я понимаю, если так вобще можно, они будут рисоваться в разные буферы и потом объединяться.
Ещё какие-нибудь варианты? Плюсы, минусы, подводные камни? ©
Приложение под Windows, если это важно.
WebGL не предлагать :)


Название: Re: OpenGL+WebKit - нужен совет
Отправлено: alexman от Сентябрь 20, 2011, 08:53
Можно попробовать QGraphicsView c viewport QGLWidget. На сцену можно добавить QWebView с помощью QGraphicsProxyWidget * QGraphicsScene::addWidget ( QWidget * widget, Qt::WindowFlags wFlags = 0 ).

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

UPDATE: извиняюсь, но
Цитировать
трёхмерную графику
не сразу увидел (так что хз реально ли это таким способом).


Название: Re: OpenGL+WebKit - нужен совет
Отправлено: UnSeen от Сентябрь 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д сцену?

Вобщем куча ламерских вопросов :)


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


Название: Re: OpenGL+WebKit - нужен совет
Отправлено: UnSeen от Сентябрь 20, 2011, 12:57
Кажется, решение найдено!
Ставим QGLWidget на viewport и делаем свою обработку QGraphicsScene::drawBackground(QPainter *painter, const QRectF &rect)
Там уже установлен нужный контекст и можно просто использовать функции OpenGL
Правда придётся на каждом кадре устанавливать заново матрицу проекции (и некоторые другие опции, вероятно), но это уже мелочи


Название: Re: OpenGL+WebKit - нужен совет
Отправлено: artiom_kh от Сентябрь 27, 2011, 12:33
можно обойтись и без сцены - у QWebView берется указатель на страницу (метод QWebView::page, возвращает указатель на QWebPage), далее дёргаем QWebPage::setView