我在窗口小部件中有一个简单的3D渲染框架,其中update()
方法负责渲染每个帧。目前我正在使用QTimer
每秒触发60次更新,这似乎没问题:
void RenderingWidget::init()
{
// ...
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(16);
}
此解决方案的问题在于帧之间可能有16 ms的空闲时间,无论它们的渲染速度有多快。在本机Windows应用程序中,我可以实现自己的消息循环,并在没有其他事件要处理的情况下继续渲染帧。在Qt中我能做些类似的东西吗?
这是我想到的,也似乎工作正常,但我读过它可能是一个不好的做法(即使用QApplication::processEvents()
):
void RenderingWidget::run()
{
running = true;
while(running)
{
update();
QApplication::processEvents();
}
}
答案 0 :(得分:1)
我终于明白了!虽然Qt中没有直接访问消息循环,但有一种QObject::event()
方法与Windows API中的WndProc()
类似。
实现问题中提到的方法的一种方法是通过继承QWidget
或QApplication
然后通过调用{{1}来处理QEvent::UpdateRequest
事件来重新实现此方法在任何其他情况下,将事件传递给默认处理程序将处理它的基类(类似于win api中的默认窗口过程)。执行更新后,您将向队列添加另一个更新请求,除非中间还有其他事件,否则控件将返回update()
,依此类推。
以下是一个示例实现:
update()