2016-04-14 63 views
0

我想将Qt应用程序图像实时传输到其他设备。 所以我需要渲染MainScreen小部件及其所有内容,并将其作为位图传递给某个通信通道。在Qt中渲染离线帧

我想最大限度地减少电话数量渲染,因为它是CPU昂贵,但我也希望能够选择在UI中的所有更改。

所以我试图把QWidget->渲染命令的paintEvent里面,却引起递归重绘错误。

抓取应用程序框架时没有递归重绘错误的最佳方式是什么?

+0

是[QWidget :: grab](http://doc.qt.io/qt-5/qwidget.html#grab)不是你在找什么? –

+0

这是抓住一个框架的另一个功能,但正如我所提到的问题是它的激活时机。如果计时器很慢,按计时器激活它可能会导致丢失事件,或者在计时器太快时导致开销过大。从paintEvent激活导致递归重绘错误。 – Alex

回答

0

它可能不是最好的解决方案,但如果它已被调用,则可以通过跳过render()调用来中断递归。

void paintEvent() { 

    ... 

    if(! m_rendering) { // m_rendering must be class member variable 
     m_rendering = true; 
     render(); 
     m_rendering = false; 
     return; 
    } 

    ... 

} 

但要注意的是,如果MainScreenpaintEvent()叫你只会渲染。所以你很可能会错过一个子部件的重绘。您可以通过使用QTimer受控update()调用来解决此问题。具体取决于您需要的帧速率。

+0

这可能是可能的解决方案,我会尝试。 – Alex