【发布时间】:2014-02-07 19:28:35
【问题描述】:
我在一个小部件内有一个简单的 3D 渲染框架,它带有一个负责渲染每一帧的 update() 方法。目前我正在使用QTimer 每秒触发 60 次更新,这似乎工作正常:
void RenderingWidget::init()
{
// ...
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(16);
}
此解决方案的问题在于,无论渲染多快,帧之间都可能有 16 毫秒的空闲时间。在本机 Windows 应用程序中,如果没有要处理的其他事件,我可以实现自己的消息循环并持续渲染帧。我可以在 Qt 中做类似的事情吗?
这是我想到的,似乎也可以,但是我读到这可能是一种不好的做法(即使用QApplication::processEvents()):
void RenderingWidget::run()
{
running = true;
while(running)
{
update();
QApplication::processEvents();
}
}
【问题讨论】:
-
我认为
QApplication::processEvents在你的情况下是可以的。您还可以在小部件的paintEvent函数中实现渲染,并使用repaint()立即调用它。您可以使用QElapsedTimer手动限制帧速率。
标签: c++ qt event-handling