• 7799阅读
  • 5回复

父窗口重绘问题 [复制链接]

上一主题 下一主题
离线myx0001
 

只看楼主 倒序阅读 楼主  发表于: 2010-11-04
— 本帖被 XChinux 执行加亮操作(2010-11-04) —
请问高手,qt4中子窗口调用repaint()或update()时是否会造成父窗口也重绘(即调用paintEvent)?
我写了个测试代码,答案是会造成父窗口重绘。很迷惑这样的话效率不是很低吗?子窗口重绘一下居然要重绘整个界面
离线hqd_2008
只看该作者 1楼 发表于: 2010-11-05
看你code的架构怎么写了,
我是这样避免的,不知道对你有用没有,
void QT_MMScreen::paintEvent( QPaintEvent *pEvent )
{
    Q_UNUSED(pEvent);
   if(pEvent->rect().contains(rect(),false))
    {
        //qDebug()<<"QT_MMScreen rect is:"<<rect()<<"window w/h is:"<<width()<<height();
        //qDebug()<<"QT_MMScreen paintEvent is:"<<pEvent->type()<<"region:"<<pEvent->region()<<"rect:"<<pEvent->rect();
        QPainter p(this);
        p.drawImage((SCREEN_WIDTH-m_bg.width())/2, (SCREEN_HEIGHT-m_bg.height())/2,m_bg);
    }
}
离线myx0001

只看该作者 2楼 发表于: 2010-11-05
这个方法可能不行吧,父窗口的rect()肯定包含了子窗口的重绘区域。
我的意思是假如一个窗口上放置了一个按钮。当按钮重绘时,该窗口的重绘函数也会被调用。
离线hqd_2008
只看该作者 3楼 发表于: 2010-11-05
回 2楼(myx0001) 的帖子
我这里使用的是update(0,0,width(),height()),这样的函数,
也就是说我需要更新的部分,比如背景图和小动画,分别放到两个CPP,
我试验的结果是OK的,不知道对其他是否有帮助,
离线myx0001

只看该作者 4楼 发表于: 2010-11-05
我的问题不是说画窗口的哪部分。而是说子窗口调用repaint会导致父窗口重绘。这样的话,假如你在一个小窗口调用repaint,父窗口也会重画。我只是想重绘子窗口,干嘛要去重绘父窗口,这样效率很低(假如父窗口要画一幅大的图)。Qt4的机制是不是就是这样的?我重我的测试代码看是这样的。
离线myx0001

只看该作者 5楼 发表于: 2010-11-07
从qt的源码看Qt4自己会进行双缓冲绘制窗口(这个是可选的,决定于hasBackingStoreSupport()),我记得Qt2里自己完成双缓冲的。Qt4这个机制是当一个窗口绘制时,会找到该窗口的顶层窗口,然后由顶向下绘制窗口。我猜这是原因。不知道高手们怎么看这个问题?知道的给个解决方法。
快速回复
限100 字节
 
上一个 下一个