重新实现调整大小事件

时间:2014-02-15 13:13:19

标签: c++ qt

我的小部件是无框架的,因为外观时尚,所以我需要重新实现调整大小的行为。

如果我拖动右下角,它已经可以使用此代码:

void mouseMoveEvent(QMouseEvent *event) {
    resize(event->pos().x(), event->pos().y());
}

但是其他所有角落呢?例如左下角。 正如人们所期望的那样,它应该表现得好像小部件的右上角会被修复。 但在调整大小功能中,左上角是固定的,因为有event.pos()==0。 我的想法是调整窗口大小然后移动它,使它看起来好像不会移动,但只改变左上角的大小。由于这会导致闪烁,甚至不是完美的结果,还有更好的方法吗?

编辑:解决方案:

a)您可以在mousePressEvent中定义:

offset = event->pos();
initialFixedCornerPosX = this->width()+this->pos().x();
initialFixedCornerPosY = this->pos().y();

并在mouseMoveEvent

int x = event->globalX();
int y = event->globalY();
int x_w = offset.x();
int y_w = offset.y();
setGeometry(x-x_w,initialFixedCornerPosY,initialFixedCornerPosX-x+x_w,y-initialFixedCornerPosY);

b)在mouseMoveEvent

QRect rect = geometry();
rect.setBottomLeft(event->globalPos());
setGeometry(rect);

1 个答案:

答案 0 :(得分:1)

要同时调整一步调整窗口而不闪烁,您应该使用QWidget::setGeometry(QRect)来提供先前使用相应的getter函数QWidget::geometry()提取的修改后的矩形。< / p>

QRect rect = geometry();
// (then modify...)
setGeometry(rect);

要修改QRect的一角,您可以直接修改每条边或角。根据逻辑的其余部分,一个比另一个更有意义。我更喜欢以下两个选项中的第二个:

使用角落的示例:

如果您检测到用户拖动左下角,请使用

rect.setBottomLeft(event->pos());

但是,您当然也需要考虑边缘,如果将角点视为单独的情况,则会导致在鼠标事件中考虑八种情况。

仅使用边缘的示例:

如果您检测到鼠标位于左边缘(它可能位于顶部或底部角落,这只是特殊情况,所以现在我们忽略它):

rect.setLeft(event->pos().x());

如果你发现它位于底边,那么

rect.setBottom(event->pos().y());

所以如果两种情况都是真的,这会有效地移动矩形的一角。因此,您只需要考虑四种情况来拖动窗口的所有边缘和角落!这假设您有一个小部件来处理调整大小(即您的顶级小部件,它在布局上有一个边距,让孩子们不触摸窗口边缘),并且添加小部件对于每个角落/边缘。