尝试在Qt中仅更新小部件中的一个矩形,但整个小部件的区域都会更新
Trying to update only a rectangle in a widget in Qt, but the entire widget's area is updated instead
这发生在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->rect
的QMessageBox
来测试这一点。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 最小硬币更换问题(自上而下方法)
- 从C++本机插件更新Vector3数组
- Qt VTK交互风格的信号到小部件
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 从另一个线程更新QT小部件的一种详细方法
- 如何强制QT更新鼠标下的小部件
- 如何每秒调用更新Qt小部件的函数
- QT中的小部件可见性更改后,小部件将何时更新
- 通过类存储和更新矢量中的电流最小值
- C++ 创建小部件数组
- 运行后台"algrothim"更新小部件Qt的最佳方式
- 尝试在Qt中仅更新小部件中的一个矩形,但整个小部件的区域都会更新
- 如何在Qt小工具项目中更新图形视图(Qt Creator)
- 为什么 QGraphicsView::update( const QRegion& ) 会导致整个小部件被更新?
- Qt:在显示之前更新隐藏的小部件
- WT小部件在boost线程中没有更新
- GTK+,如何将小部件更新到主循环中
- 更新std::set,只保留最小的值