症状
在QGraphicsView的事件中,不论使用 update,repaint,抑或updateScence,resetCacheContent, 均不可以刷新界面
程序里参考上一篇博文的方法,在QGraphicsView中使用了Opengl,即,把QGraphicsView的视口委托给QGLWidget来渲染
参考资料
一个比一个坑爹,都不管用
http://lists.trolltech.com/qt-interest/2007-02/thread00033-0.html
http://www.qtforum.org/article/19433/repainting-a-qgraphicsview-after-the-scene-is-modified.html
http://www.qtcentre.org/threads/12089-GraphicsView-update-background
解决方案
全球首发,过了这村就没这店
尼玛要调用 viewport 的update函数!!!
参考代码
首先,把QGLWidget绑定到QGraphicsView上,从而可以使用opengl进行渲染
void MYGraphicsView::setRenderGLWidget(QGLWidget *widget)
{
this->setViewport(widget);
this->setViewportUpdateMode(
QGraphicsView::FullViewportUpdate);
}
在 drawBackground 函数中使用opengl画图
void MYGraphicsView::drawBackground(QPainter *,const QRectF &)
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0,1,0,1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor3f(0,0,0);
glLineWidth(2);
float margin=0.05;
float l=margin,r=1-margin,b=margin,t=1-margin;
int splitNum=9;
float dx=(1-margin*2)/(splitNum+1);
glBegin(GL_LINE_LOOP);
glVertex2f(l,b);
glVertex2f(l,t);
glVertex2f(r,t);
glVertex2f(r,b);
glEnd();
glBegin(GL_LINES);
for(int i=1;i<=splitNum;++i)
{
glVertex2f(l,b+dx*i);
glVertex2f(r,b+dx*i);
glVertex2f(l+dx*i,b);
glVertex2f(l+dx*i,t);
}
glEnd();
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
}
最后,尼玛坑爹的事件更新
void MYGraphicsView::wheelEvent( QWheelEvent * event )
{
double factor=event->delta()>0?1.1:1/1.1;
mpiMsg.scale.x*=factor;
mpiMsg.scale.y=mpiMsg.scale.x;
this->viewport()->update();
mpiMsg.broadCast(M*N);
MPI_Barrier(MPI_COMM_WORLD);
}