C++ 试图在Qt中只更新小部件中的一个矩形,但更新整个小部件';s区域将被更新

C++ 试图在Qt中只更新小部件中的一个矩形,但更新整个小部件';s区域将被更新,c++,qt,C++,Qt,这发生在Qt模拟器(用于手机)中。我试图只更新小部件区域的一部分,但是整个小部件都被更新了 要进行说明,请使用以下代码: void Widget::mousePressEvent(QMouseEvent *event) { update(0, 0, 10, 10); } void Widget::paintEvent(QPaintEvent *event) { qDebug() << event->rect(); } void小部件::MousePresse

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

要进行说明,请使用以下代码:

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

void Widget::paintEvent(QPaintEvent *event)
{
    qDebug() << event->rect();
}
void小部件::MousePresseEvent(QMouseEvent*事件)
{
更新(0,0,10,10);
}
void小部件::paintEvent(QPaintEvent*事件)
{
qDebug()rect();
}
单击小部件时提供以下调试输出:

QRect(0,0 458x832)

这是小部件的整个区域

我做错了什么


编辑

我在Linux上运行了相同的代码,它正常工作,调试输出是

QRect(0,0 10x10)


我不熟悉手机上的Qt。但可能是其他原因触发了整个小部件的更新。Qt为一个事件循环处理期间调用的所有
update()
发送一个
paintEvent
。因此,您的代码可能要求进行部分更新,但窗口系统中的某个地方可能会以某种方式受到影响,并要求进行完全更新


试着看看这是否会将您的paintEvent发送到正确的区域。

在我看到的大多数GUI框架中,您不能只更新应用程序窗口/小部件的某些部分。即使API中有一些函数来更新您正在使用的类似矩形的更新(x,y,x,y),也只是通知框架它需要更新至少给定的矩形,框架可以更新屏幕的更大部分

我不确定它在phone Qt中是如何工作的,但在桌面版本中是这样做的,因为在大多数操作系统中,GUI应用程序不会将其“图像”存储在任何地方,如果最小化并显示窗口,则需要重新创建整个曲面


所有这些都意味着您不能依赖于这样的假设,即您将绘制某些内容,然后在需要时在某个自定义矩形中添加其他绘制操作。您应该实现一些通用的“绘制”功能,它可以从头开始重新绘制所有内容,并将绘制优化留给框架。

事实证明,此缺陷仅存在于Qt模拟器中。在实际的手机上,更新区域被正确传递。我通过显示一个坐标为
event->rect
QMessageBox
来测试这一点

好主意。我试过了,但它仍然使整个区域无效。我应该检查一下它在实际手机上是否有相同的行为。可能只是模拟器的一个怪癖。在iOS和MAC上遇到同样的问题,你有没有找到解决方案?