• Qt 在 QGraphicsView 中使用 opengl 不能够刷新的解决方案


    症状

    在QGraphicsView的事件中,不论使用 update,repaint,抑或updateScence,resetCacheContent, 均不可以刷新界面

    程序里参考上一篇博文的方法,在QGraphicsView中使用了Opengl,即,把QGraphicsView的视口委托给QGLWidget来渲染

    参考资料

    一个比一个坑爹,都不管用

    解决方案

    调用 viewport 的update函数!!!

    参考代码

    首先,把QGLWidget绑定到QGraphicsView上,从而可以使用opengl进行渲染

    1 void MYGraphicsView::setRenderGLWidget(QGLWidget *widget)
    2 {
    3     this->setViewport(widget);
    4     this->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
    5 }

    在 drawBackground 函数中使用opengl画图

     1 void MYGraphicsView::drawBackground(QPainter *,const QRectF &)
     2 {
     3     glClearColor(1,1,1,1);
     4     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     5  
     6     glMatrixMode(GL_PROJECTION);
     7     glPushMatrix();
     8     glLoadIdentity();
     9     gluOrtho2D(0,1,0,1);
    10  
    11     glMatrixMode(GL_MODELVIEW);
    12     glPushMatrix();
    13     glLoadIdentity();
    14  
    15     glColor3f(0,0,0);
    16     glLineWidth(2);
    17  
    18     float margin=0.05;
    19     float l=margin,r=1-margin,b=margin,t=1-margin;
    20     int splitNum=9;
    21     float dx=(1-margin*2)/(splitNum+1);
    22  
    23     glBegin(GL_LINE_LOOP);
    24         glVertex2f(l,b);
    25         glVertex2f(l,t);
    26         glVertex2f(r,t);
    27         glVertex2f(r,b);
    28     glEnd();
    29  
    30     glBegin(GL_LINES);
    31     for(int i=1;i<=splitNum;++i)
    32     {
    33         glVertex2f(l,b+dx*i);
    34         glVertex2f(r,b+dx*i);
    35         glVertex2f(l+dx*i,b);
    36         glVertex2f(l+dx*i,t);
    37     }
    38     glEnd();
    39     glPopMatrix();
    40  
    41     glMatrixMode(GL_PROJECTION);
    42     glPopMatrix();
    43 }

    最后,事件更新

     1 void MYGraphicsView::wheelEvent( QWheelEvent * event )
     2 {
     3     double factor=event->delta()>0?1.1:1/1.1;
     4     mpiMsg.scale.x*=factor;
     5     mpiMsg.scale.y=mpiMsg.scale.x;
     6    this->viewport()->update();
     7 
     8     mpiMsg.broadCast(M*N);
     9     MPI_Barrier(MPI_COMM_WORLD);
    10 }
  • 相关阅读:
    Symantec Backup Exec Remote Agent 2010在Redhat Enterprise 6.6上启动问题
    RMAN冷备份异机还原
    ORACLE OLAP错误ORA-06512: at "SYS.OLAPIHISTORYRETENTION"
    expdp 报The value (30) of MAXTRANS parameter ignored错误的原因诊断
    ORA-01157 & ORA-01110
    INITIAL参数设置导致TRUNCATE TABLE不能降低高水位线案例
    ORA-19563: header validation failed for file
    ORACLE NUMBER类型Scale为0引发的问题
    ORA-04063: view "SYS.DBA_REGISTRY" has errors
    Linux 格式化扩展分区(Extended)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13529181.html
Copyright © 2020-2023  润新知