一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

症状

在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 }

 

posted on 2020-08-19 14:29  一杯清酒邀明月  阅读(969)  评论(0编辑  收藏  举报