QTimer的非空闲替代方案,用于定期调用的函数

时间:2014-02-07 19:28:36

标签: c++ qt event-handling

我在窗口小部件中有一个简单的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();
    }
}

1 个答案:

答案 0 :(得分:1)

我终于明白了!虽然Qt中没有直接访问消息循环,但有一种QObject::event()方法与Windows API中的WndProc()类似。

实现问题中提到的方法的一种方法是通过继承QWidgetQApplication然后通过调用{{1}来处理QEvent::UpdateRequest事件来重新实现此方法在任何其他情况下,将事件传递给默认处理程序将处理它的基类(类似于win api中的默认窗口过程)。执行更新后,您将向队列添加另一个更新请求,除非中间还有其他事件,否则控件将返回update(),依此类推。

以下是一个示例实现:

update()