试图只更新Qt中的一个小部件的矩形,但整个小部件的区域被更新
问题描述:
这发生在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)
答
在我看到的大多数GUI框架中,您无法只更新应用程序窗口/小部件的某些部分。即使在API中有一些函数用于更新某个矩形,比如您正在使用的update(x,y,x,y),它只是通知Framework需要更新至少给定的矩形,并且框架可以更新屏幕的更大部分。
我不确定它是如何在手机Qt中工作的,但是在桌面版本中它是这样做的,因为在大多数操作系统中GUI应用程序不会在任何地方存储它的'图像',并且如果你最小化然后显示你的窗口,重新创建整个表面。
所有这一切意味着你不能依赖假设,你将绘制一些东西,然后当你需要的时候你会在某个自定义矩形中添加其他绘画操作。你应该实现一些通用的'绘画'功能,它可以从头开始重绘所有内容,并将绘画优化留给框架。
答
事实证明,这个错误只存在于Qt Simulator中。在实际的电话本身上,更新区域正在正确传递。我通过显示QMessageBox
的坐标为event->rect
来测试此项。
在iOS和MAC上遇到同样的问题,你有没有找到解决方案? – jjxtra 2015-01-10 01:02:23