我的小部件是无框架的,因为外观时尚,所以我需要重新实现调整大小的行为。
如果我拖动右下角,它已经可以使用此代码:
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);
答案 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());
所以如果两种情况都是真的,这会有效地移动矩形的一角。因此,您只需要考虑四种情况来拖动窗口的所有边缘和角落!这假设您有一个小部件来处理调整大小(即您的顶级小部件,它在布局上有一个边距,让孩子们不触摸窗口边缘),并且不添加小部件对于每个角落/边缘。