我们说我有一面墙,用户只能有N
个窗口。我应该限制用户将一个窗口设置为另一个窗口。他可以移动,调整大小,但他不能重叠。要忽略无效移动,我会抓住moveEvents
,如果event->pos()
是无效位置,我会将几何图形重置为event->oldPos()
。那么这种方法不适用于resizeEvent
。
为什么我不能在调整大小时使用相同的方法?
如何解决这个问题?
P.S 设置maximumSize和minimumSize并不是一个好主意,因为我的实现会消耗它。
答案 0 :(得分:1)
当用户调整窗口大小或resize
被调用时,Qt将Qt::WA_WState_ConfigPending
标志设置为true
并启动内部调整大小操作。在这些操作过程中,您会收到resizeEvent
。如果您尝试调用resize
那里Qt
只检查该标志是否已设置并忽略新的调整大小,直到前一个完成,但是它再次使用相同的数据发送resizeEvent
并且您进入无休止的递归。
您可以使用此技巧来克服检查:
void widget::resizeEvent(QResizeEvent* e)
{
if (e->size().width() > 800)
{
setAttribute(Qt::WA_WState_ConfigPending, false);
resize(e->oldSize());
}
}
然而,您仍然会看到窗口闪烁,因为当您获得resizeEvent
时,它已经调整了大小。实际上,操作系统调整窗口大小,然后将WM_SIZE
消息发送到窗口以处理更改,这就是为什么必须处理调整大小操作的结果。