gpt4 book ai didi

c++ - 重新实现调整大小事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:06 24 4
gpt4 key购买 nike

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

如果我拖动右下角,它已经适用于此代码:

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

但是其他所有角呢?例如左下角。正如人们所期望的那样,它应该表现得好像小部件的右上角是固定的。但是在resize函数中,左上角是固定的,因为有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);

最佳答案

要调整大小一步移动窗口而不闪烁,您应该使用QWidget::setGeometry(QRect)通过提供先前使用相应的 getter 函数获取的修改后的矩形 QWidget::geometry() .

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

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

使用角的示例:

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

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

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

仅使用边缘的示例:

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

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

如果你检测到它在底部边缘,那么

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

所以如果两种情况都为真,这实际上移动了矩形的角。所以你只需要考虑四种情况就可以拖动你窗口的所有边角!这假设您有一个处理调整大小的小部件(即您的顶级小部件,它在布局上有一个边距让 child 不接触窗口边缘),并且不要添加一个小部件对于每个角/边。

关于c++ - 重新实现调整大小事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21798053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com