2012-07-29 81 views
0

这发生在Qt模拟器(用于手机)。我试图只更新一个小部件区域的一部分,但是整个小部件会被更新。试图只更新Qt中的一个小部件的矩形,但整个小部件的区域被更新

为了说明,下面的代码:

void Widget::mousePressEvent(QMouseEvent *event) 
{ 
    update(0, 0, 10, 10); 
} 

void Widget::paintEvent(QPaintEvent *event) 
{ 
    qDebug() << event->rect(); 
} 

提供了以下调试输出,当我点击小工具:

查阅QRect(0,0 458x832)

哪是小部件的整个区域。

我在这里做错了什么?


编辑

我跑在Linux上相同的代码,和它的工作,因为它应该,调试输出是

查阅QRect(0,0 10×10)

+0

在iOS和MAC上遇到同样的问题,你有没有找到解决方案? – jjxtra 2015-01-10 01:02:23

回答

0

在我看到的大多数GUI框架中,您无法只更新应用程序窗口/小部件的某些部分。即使在API中有一些函数用于更新某个矩形,比如您正在使用的update(x,y,x,y),它只是通知Framework需要更新至少给定的矩形,并且框架可以更新屏幕的更大部分。

我不确定它是如何在手机Qt中工作的,但是在桌面版本中它是这样做的,因为在大多数操作系统中GUI应用程序不会在任何地方存储它的'图像',并且如果你最小化然后显示你的窗口,重新创建整个表面。

所有这一切意味着你不能依赖假设,你将绘制一些东西,然后当你需要的时候你会在某个自定义矩形中添加其他绘画操作。你应该实现一些通用的'绘画'功能,它可以从头开始重绘所有内容,并将绘画优化留给框架。

0

我不熟悉手机上的Qt。但也许别的东西正在触发整个小部件的更新。 Qt发送一个paintEvent用于在一个事件循环处理过程中调用的所有update()。所以你的代码可能需要进行部分更新,但窗口系统中的某个地方可能会以某种方式触及并要求完全更新。

尝试repaint(),看看是否发送你的paintEvent的正确区域。

+0

好主意。尽管我尝试了,但它仍然使整个区域无效。我应该检查它是否在实际电话上具有相同的行为。可能只是模拟器的一个怪癖。 – sashoalm 2012-07-29 20:33:00

0

事实证明,这个错误只存在于Qt Simulator中。在实际的电话本身上,更新区域正在正确传递。我通过显示QMessageBox的坐标为event->rect来测试此项。