QT新手的疑问

谢邀,Qt做的不多。这段代码应该是SDK的消息泵。意图应该是每次消息循环调用update,如果不是游戏的话,应该是没有必要的,会严重影响系统运行效率。kinect应该是调用Windows下的directdraw,因此不能直接用wmpaint响应,所以SDK中习惯性写到消息泵下。Qt中应该不是使用directdraw。
■网友
大致有以下几种方法可供参考:1、用QTimer或者QBasicTimer来实现定时器,按照一定频率执行update()函数,这也是最为传统的简单的方式,前者只需要定义一个槽函数,后者则重写当前Widget/Window的timeEvent()即可2、在独立的线程,例如QThread里执行您的更新过程,不过注意到您在原文中提到更新UI,不知道是否是Qt自己的UI,那样的话不建议因此引起不必要的数据冲突3、事实上您可以自己管理Qt的消息循环,而不用调用app.exec(),例如下面的方式while ( !quitFlag ){ QCoreApplication::processEvents(QEventLoop::AllEvents, 100); // your update code}当然这里存在一个可能的隐患,就是模态的QDialog会暂时阻塞主进程而自己开启一个新的消息循环,这是您采用这种方案所无法监测到的
■网友
1.派生QApplication/QCoreApplication,重写QCoreApplication::notify,你的update放这个里面,别忘了调基类的notify;2.用timer。
■网友
我觉得并不需要每次消息循环都去更新GUI,只在你必要的时候更新必要widget 的状态就可以了。。。当然这样你就得自己写一遍code而不是换一个实现方法来移植win32的这个代码。最好不用新的thread,我曾经做过一个试验,用新的thread来控制主widget,动不动就死了。主要问题出在你要控制GUI的地方一定要插入主事件循环才能做,放在thread循环里就不work,而放进主循环的话你起这个thread根本没意义。加timer来响应比较简单,但如前所说你其实不需要每次都update,只在必要的时候做一个signal就可以了,可以是在响应某个经常性event的时候检查,比如cursor motion。或者干脆自己重写事件循环,但是不那么必要吧。


    推荐阅读