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