限制QWidget大小

时间:2014-09-24 11:31:09

标签: c++ linux qt window

我们说我有一面墙,用户只能有N个窗口。我应该限制用户将一个窗口设置为另一个窗口。他可以移动,调整大小,但他不能重叠。要忽略无效移动,我会抓住moveEvents,如果event->pos()是无效位置,我会将几何图形重置为event->oldPos()。那么这种方法不适用于resizeEvent
为什么我不能在调整大小时使用相同的方法?
如何解决这个问题?

P.S 设置maximumSize和minimumSize并不是一个好主意,因为我的实现会消耗它。

1 个答案:

答案 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消息发送到窗口以处理更改,这就是为什么必须处理调整大小操作的结果。