一、update()使用场景:
1、更新小部件,除非禁用更新或隐藏小部件。
2、更新自绘数据如:图表,实时数据显示等
二、使用方法
使用update()这个函数不会立即重新绘制;在调用后会生成一个update的刷新事件,并加入到Qt主事件循环中,它会安排一个绘制事件进行处理。这使得Qt可以比调用repaint()实现更快的速度和更少的闪烁。但是多次调用update()通常只会产生一个paintEvent()调用。此时会出现一种情况当频繁调用update时,会出现界面刷新卡顿,显示异常等问题(尤其在实时绘制鼠标轨迹类的自绘出现较为明显)。
解决方法1:在使用图片作为主体的自绘控件可以使用预加载图片的形式进行drawImage的绘制,这样可以减少文件的读取次数,从而加快刷新速度。
解决方法2:在使用绘制画笔,白板类自绘控件可以使用update的重置函数 void update(int x, int y, int w, int h); void update(const QRect&);void update(const QRegion&);这三个来进行局部刷新,以达到加快实时刷新的需求。
例:以实时刷新绘制鼠标运动轨迹为例,可以根据鼠标当前位置event->pos(),来设置需要刷新范围,update(updateX, updateY, updateHalfW << 1, updateHalfW << 1);
如果是用多点触控建议使用void update(const QRegion&);
QRegion updateRegion;
const int updateX = qRound(touchPoint.pos().x() - updateHalfW);
const int updateY = qRound(touchPoint.pos().y() - updateHalfW);
updateRegion += QRegion(QRect(updateX, updateY, updateHalfW << 1, updateHalfW << 1));
update(updateRegion);
Qt通常会在调用paintEvent()之前擦除小部件的区域。如果设置了Qt::WA_OpaquePaintEvent小部件属性,该小部件将负责用不透明的颜色绘制其所有像素。