Приложение Qt для браузера со странным поведением opengl-es2 (не работает) - PullRequest
0 голосов
/ 04 октября 2011

Я включил поддержку opengl-es2 в Qt / E, и я хотел сделать приложение для браузера, и код:

int main (int argc, char * argv []) {

QApplication a(argc, argv);

QGraphicsView g;
g.setScene(new QGraphicsScene(&g));
g.scene()->setItemIndexMethod(QGraphicsScene::NoIndex);

g.setAttribute(Qt::WA_DeleteOnClose);
g.setOptimizationFlags(QGraphicsView::DontAdjustForAntialiasing);
g.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
g.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
g.setAlignment(Qt::AlignTop | Qt::AlignHCenter);
g.setFrameStyle(QFrame::NoFrame);
g.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

g.setViewport(new QGLWidget());
g.showFullScreen();

QGraphicsWebView view;

view.load(QUrl("http://www.google.com"));
view.setGeometry(QRectF(0,0,800,400));
view.show();

g.scene()->addItem(&view);

a.exec();

}

Я вижу, как страница Google загружается в течение доли секунды, а затем после ее исчезновения.

Ошибка в журнале вставки ссылки ==> http://pastebin.com/bgbQqd1M

1 Ответ

0 голосов
/ 19 октября 2011

Ashish,

Какие изменения вы внесли в плагин платформы eglfs? Я также модифицировал плагин eglfs, чтобы он работал на плате arm.

Два места, которые я изменил:

  1. избегайте вызова eglMakeCurrent дважды, когда EGLDisplay, EGLSurface (чтение), EGLSurface (рисование), EGLDisplay не изменяются --- На моей доске вызов eglMakeCurrent дважды вызовет прерывание программы.

  2. Проблема такая же, как и у вас (QGLShader :: QGLShader: 'context' должен быть текущим контекстом или совместно с ним.)

    В библиотеке QtOpengl есть функция QGLWidget * qt_gl_share_widget (), которая создаст новый QGLContext и установит его в QPlatformGLContext.

    В bool QGLShaderProgram :: bind () он будет проверять currentContext с тем, что в QGLSharedResourceGuard. QGLContext :: areSharing (d-> programGuard.context (), QGLContext :: currentContext ()).

Чтобы исправить эту проблему. Я добавляю следующий код в qeglplatformcontext.cpp

#include <QGLContext>

class QEGLFSContext : public QGLContext
{
public:
    bool chooseContext(const QGLContext* shareContext = 0)
    {
        QGLContext::chooseContext(shareContext);   // in QGLContext, this guy is protected
    }
};

void QEGLPlatformContext::makeCurrent()
{
    QPlatformGLContext::makeCurrent();
    QGLContext * ctx = QGLContext::fromPlatformGLContext(this);
    QEGLFSContext* eglctx = (QEGLFSContext*)ctx;
    static QEGLFSContext * s_ctx = eglctx;
    if (s_ctx != eglctx)
    {
        s_ctx->chooseContext();
    }
    //...
}

После использования этих изменений я могу запустить hellogl_es2 и показать анимацию для отображения логотипа Qt и пузырьков.

Но у меня все еще есть некоторые проблемы: QLabel, QMenu ... не могу показать.

У вас есть идеи по поводу этой проблемы? У меня тоже есть идея от какого-то парня, у qws / simplegl тоже есть эти проблемы.

...