zoukankan      html  css  js  c++  java
  • QT 在 QGraphicsView 中使用 opengl 不能够刷新的解决方案

    症状

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

      

  • 相关阅读:
    _#【命名】 / _
    _#【插件】
    _#【命名】样式类
    linux dd命令
    python urllib2和urllib的区别
    hadoop的find
    hadoop的fs基本命令
    /etc/profile和 . profile 文件
    广告sdk
    linux下查找文件的常用命令
  • 原文地址:https://www.cnblogs.com/dabaopku/p/2247721.html
Copyright © 2011-2022 走看看