症状
在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 }
分类:
Qt
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)