尝试在Qt中仅更新小部件中的一个矩形,但整个小部件的区域都会更新

Trying to update only a rectangle in a widget in Qt, but the entire widget's area is updated instead

本文关键字:小部 更新 区域 Qt 一个      更新时间:2023-10-16

这发生在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 10x10)

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

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

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

我不熟悉手机上的Qt。但也许是其他东西触发了整个小部件的更新。Qt针对在一个事件循环处理期间调用的所有CCD_ 2发送一个CCD_。因此,您的代码可能会调用部分更新,但窗口系统中的某个地方可能会以某种方式被触摸并调用完全更新。

尝试repaint(),看看这是否会将您的paintEvent发送到正确的区域。

原来这个bug只存在于Qt模拟器中。在实际的手机上,更新区域被正确传递。我通过显示坐标为event->rectQMessageBox来测试这一点。