0

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

为了说明,下面的代码:

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)

4

3 回答 3

0

我对手机上的 Qt 不熟悉。但也许其他东西正在触发整个小部件的更新。Qt在一个事件循环处理期间paintEvent为所有调用发送一个。update()因此,您的代码可能要求进行部分更新,但窗口系统中的某处可能会以某种方式被触及并要求进行全面更新。

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

于 2012-07-29T15:02:34.170 回答
0

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

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

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

于 2012-07-30T16:15:29.647 回答
0

事实证明,这个错误只存在于 Qt Simulator 中。在实际手机本身上,更新区域被正确传递。我通过显示QMessageBox坐标为 的a 对此进行了测试event->rect

于 2012-08-04T07:57:13.497 回答