2015-04-28 48 views
1

我有一个QWidget,它有一个非常强大的CPU事件处理程序。但它几乎不需要更新,虽然它在屏幕上移动。我知道如何实现双缓冲油漆机制,但因为所有QWidgets已经拥有了双缓冲系统,我很好奇,想看看是不是可以使用它的目的,这样的事情:如何使用qwidget双缓冲区

void ParametersWidget::paintEvent(QPaintEvent *) 
{ 
    if(isnt_changed) { 
     bypassUpdate(); 
    } 
    else { 
    drawStuff(); 
    } 
} 

任何帮助将不胜感激。

回答

1

您不能忽略绘画事件,因为您的小部件可能已被其他窗口覆盖,并且当移动此窗口时,您的小部件需要重新绘制。一种可能的优化是只绘制脏区域。它可以通过拨打QPaintEventregion()获得。没有理由重新绘制整个小部件,如果只有一部分需要重新绘制。

不知道你的小部件包含了什么,它很难给出任何更具体的优化提示。如果小部件的内容需要昂贵的数据库查询或大量计算,那么当然应该确保仅在需要时执行这些操作,保存结果并在重新绘制期间使用结果。

+0

以及这与我的问题有何关系,关于双缓冲? –

+1

你提到你有一个非常CPU的油漆处理程序,我想你想尝试提高性能。当我读到你的问题时,我的印象是你认为双缓冲可以帮助你达到目的,但双缓冲与性能无关(只有闪烁)。如果您对如何提高性能不感兴趣,请忽略我的答案。对于双缓冲,你不需要做任何事情。 Qt自Qt 4.0以后自动为你做。 –

+0

看,让我解释一下。正如你所说的那样,Qt会自动进行双缓冲。这意味着它将我的小部件的快照作为像素图存储在RAM中,并且在决定时渲染它而不是调用我的小部件的绘图函数。现在考虑它已经收到一个更新信号并且调用了paint函数,但是我的小部件知道它不需要更新。显然,我可以保留最后一个paint的pixmap并重新渲染它,但是我想看看是否有方法使用内置的缓冲pixmap,而不是手动将其保存在额外的缓冲区中。 –