Qt浏览器应用程序与opengl-es2奇怪的行为(不工作)

时间:2011-10-04 09:59:11

标签: qt opengl-es-2.0 qgraphicsview

我在Qt / E中启用了opengl-es2支持,我想制作一个浏览器应用程序,代码是:

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();

}

我可以看到谷歌页面加载了几分之一秒然后消失了。

错误日志粘贴bin链接==> http://pastebin.com/bgbQqd1M

1 个答案:

答案 0 :(得分:0)

与Ashish,

您对eglfs平台插件进行了哪些更改? 我还修改了eglfs插件,让它在扶手板上运行。

我改变的两个地方是:

  1. 避免调用eglMakeCurrent两次,当EGLDisplay,EGLSurface(读取),EGLSurface(Draw),EGLD显示没有改变---在我的板上,调用eglMakeCurrent两次将导致程序中止。

  2. 问题与您相同(QGLShader :: QGLShader:' context'必须是当前上下文或与之共享。)

    在QtOpengl库中,有一个函数QGLWidget * qt_gl_share_widget(),它将创建一个新的QGLContext并将其设置为QPlatformGLContext。

    在bool QGLShaderProgram :: bind()中,它将使用QGLSharedResourceGuard中的一个来检查currentContext。 QGLContext :: areSharing(d-> programGuard.context(),QGLContext :: currentContext())。

  3. 解决此问题。 我在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也有这些问题。