如何强制 QGLWidget 更新屏幕?
Posted
技术标签:
【中文标题】如何强制 QGLWidget 更新屏幕?【英文标题】:How to force QGLWidget to update screen? 【发布时间】:2013-02-21 12:15:47 【问题描述】:我正在使用 Open GL 绘制一个简单的场景。我继承了 QGLWidget 并覆盖了paintGL()。没什么好看的:
void CGLWidget::paintGL()
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (120.0, 160.0, -300.0, 0.0 + 120.0, 0.0 + 160.0, 2.0 - 300.0, 0.0, 1.0, 0.0);
glScalef(1.0f/300.0f, 1.0f/300.0f, 1.0f/300.0f);
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(80.0, width()/(double)height(), 5.0, 100000.0);
glMatrixMode(GL_MODELVIEW);
glBegin(GL_POINTS);
glColor3f(1.0f,0.6f,0.0f);
glVertex3d(x, y, z);
// ...drawing some more points...
glEnd();
我在主窗口中有一个计时器,它触发 GL 小部件的 updateGL()
。我已经验证它会导致 paintGL()
被调用。但是,屏幕上的实际图片很少更新。即使我调整窗口大小,场景也不会更新。为什么会这样?如何强制更新?
【问题讨论】:
请问:为什么paintGL
中两次初始化投影和MV矩阵?你在两者之间画了什么吗?如果没有,你用第二个矩阵覆盖第一个矩阵,你可以将此代码移动到resizeGL
(投影)和initializeGL
(模型视图)
@leemes:不知道,实际上...这是一个错误,是我试图找到实际有效的投影和 MV 参数的残余。已修复,谢谢。
【参考方案1】:
不要从计时器调用 updateGL(),而是调用 update() 以确保视图获得绘制事件。
【讨论】:
它不起作用,paintGL()
根本不会被调用。也尝试调用两者 - 也不起作用。不过谢谢你的提示。
尝试在 QGLWidget::paintEvent 中设置一个断点,看看它在调用 update() 后是否到达那里,之后会发生什么。
只有在我调整窗口大小时才会调用。
您是否在视图的构造函数中设置了任何窗口标志?如果您让事件循环正确运行并且您没有禁用小部件上的更新,更新应该会导致您在调用它后不久的某个时间获得一个绘制事件。没有得到一个绘画事件是你的问题。
非常感谢,找到问题了!实际上只是我的一个逻辑问题,但你的回答有帮助:)【参考方案2】:
在你的 CGLWidget 构造函数中
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(10);
timer -> start(VALUE);
玩 `VALUE 10 只是一个例子。
装饰
【讨论】:
嘿,我用过这种技术,它行得通。是否有某种方式可以在渲染前一个场景后立即更新场景,因为现在我的计时器有 10 毫秒的瓶颈。我不能比这更快。 玩 `VALUE 10 只是一个例子。如果你把 1 放在那里,它会是 1ms,但是点不是,当你想刷新屏幕时,点是你的场景准备好.. 正是我所说的。一旦我的场景准备就绪,我希望触发更新。 然后确定你是否真的需要一个计时器。还有timer(0)
会立即射出计时器
嗯,这就是我需要知道的,如何从应用程序本身中删除计时器。我宁愿不使用它。以上是关于如何强制 QGLWidget 更新屏幕?的主要内容,如果未能解决你的问题,请参考以下文章