zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    jquery on()动态绑定元素的的点击事件无反应的问题记录
    【分享】开源富文本编辑器之间的较量
    【分享】JS如何为复制的Web文本添加其他信息
    HTML table导出到Excel中的解决办法
    Vue跨门槛系列之实例的阐述
    Vue.js 基本功能了解一下~
    JS数据结构的栈和队列操作
    CSS宽度高度的百分比取值基于谁
    CSS个人笔记
    使用word设置标题级别, 自动生成和大纲对应的多级列表, 自动生成索引目录
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13529181.html
Copyright © 2011-2022 走看看