• 7844阅读
  • 4回复

请教高手:如何禁止QWidget::update()的预擦除动作 [复制链接]

上一主题 下一主题
离线zooood
 
只看楼主 倒序阅读 楼主  发表于: 2010-11-26
QWidget类的repaint()和update()会先擦除绘图区域内的图形(实际上就是用背景色去刷新一遍)

但这样效率比较低下。
我想手动擦除旧的图形(这个不难,只要沿着旧图形的线条,用背景色描一遍就可以了),而不是update那样粗暴地对整个矩形区域用背景色刷一遍
有什么办法可以做到禁止update刷背景?

注:有说可以在QPixmap上画的,但我以为这并没有禁止update刷背景,我想让update真正的停止预擦除动作
离线roywillow

只看该作者 1楼 发表于: 2010-11-26
update好像是可以传递需要重绘的区域的
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线zooood
只看该作者 2楼 发表于: 2010-11-27
引用第1楼roywillow于2010-11-26 22:08发表的  :
update好像是可以传递需要重绘的区域的

的确是,但是这样效率也很低啊
假如我只要擦除一个倾斜的线段,那我必须调用update(x,y,w,h),它会去擦除这条线段覆盖的整个矩形,这是没有必要的
离线dbzhang800

只看该作者 3楼 发表于: 2010-11-27
引用第2楼zooood于2010-11-27 08:18发表的  :
的确是,但是这样效率也很低啊
假如我只要擦除一个倾斜的线段,那我必须调用update(x,y,w,h),它会去擦除这条线段覆盖的整个矩形,这是没有必要的



我想知道你这个效率高低结论是如何得出的?能给出论据么
离线zooood
只看该作者 4楼 发表于: 2010-11-27
谢谢ls几位热心人
关于效率问题,举个例子:

譬如我要在矩形(0,0,3,3)内画一个新的图形,而在这个区域里面已经有一条以(0,3)为起点、(3,0)为终点的直线,这条直线本身只穿过3个像素。写代码的时候,我必须调用update(0,0,3,3)来发出绘图事件,而update(0,0,3,3)会对(0,0,3,3)这个矩形进行擦除,
这里就有3*3共9个点被执行了擦除动作,而真正需要被擦除的像素点只有3个,另外6个点的擦除操作就没有必要

大多数时候这点效率损失不会造成大的问题,但最近做的一个程序里涉及到了频繁的绘图操作,所以还是老样子做的话就有点捉襟见肘了。
快速回复
限100 字节
 
上一个 下一个