void Widget::mouseMoveEvent(QMouseEvent *event) { //点击在按钮btn上,无法获取event->pos() if(this->drag) { //计算label要移动到的新位置 QPoint npos=event->pos()+this->pos;//一直补偿差值!!!!! QSize s1=this->size();//窗口大小 QSize s2=ui->label->size();//label大小 if(npos.x()<0)//不超左边 { npos.setX(0); } else if(npos.x()>s1.width()-s2.width())//不超右边 { npos.setX(s1.width()-s2.width()); } if(npos.y()<0)//不超上边 { npos.setY(0); } else if(npos.y()>s1.height()-s2.height())//不超下边 { npos.setY(s1.height()-s2.height()); } ui->label->move(npos);//移动到新位置 } }
时间: 2024-02-07 15:04:01 浏览: 132
这段代码实现了鼠标拖动窗口中一个标签(label)的功能,并限制了标签的移动范围不超过窗口范围。但是,如果拖动的时候鼠标指针位于按钮(btn)上,无法获取到正确的鼠标位置,导致标签位置计算错误。
解决方法可以通过判断鼠标指针所在的部件,如果不是按钮(btn)则进行标签位置计算和移动,否则不进行操作。示例代码如下:
```cpp
void Widget::mouseMoveEvent(QMouseEvent *event) {
if (this->drag) {
QWidget *child = childAt(event->pos());
if (!child || child == ui->label) { // 如果鼠标指针不在任何部件上或在标签上
QPoint npos = event->pos() + this->pos(); // 计算标签要移动到的新位置
QSize s1 = this->size(); // 窗口大小
QSize s2 = ui->label->size(); // 标签大小
if (npos.x() < 0) // 不超出左侧
npos.setX(0);
else if (npos.x() > s1.width() - s2.width()) // 不超出右侧
npos.setX(s1.width() - s2.width());
if (npos.y() < 0) // 不超出上侧
npos.setY(0);
else if (npos.y() > s1.height() - s2.height()) // 不超出下侧
npos.setY(s1.height() - s2.height());
ui->label->move(npos); // 移动标签到新位置
}
}
}
```
这样就可以避免鼠标指针在按钮(btn)上时导致标签位置计算错误的问题了。
阅读全文