diff --git a/movewidget/frmmovewidget.cpp b/movewidget/frmmovewidget.cpp index 8c6b7be..066ea71 100644 --- a/movewidget/frmmovewidget.cpp +++ b/movewidget/frmmovewidget.cpp @@ -1,4 +1,4 @@ -#pragma execution_character_set("utf-8") +#pragma execution_character_set("utf-8") #include "frmmovewidget.h" #include "ui_frmmovewidget.h" diff --git a/movewidget/movewidget.cpp b/movewidget/movewidget.cpp index 70d2181..9caf390 100644 --- a/movewidget/movewidget.cpp +++ b/movewidget/movewidget.cpp @@ -7,6 +7,7 @@ MoveWidget::MoveWidget(QObject *parent) : QObject(parent) lastPoint = QPoint(0, 0); pressed = false; leftButton = true; + inControl = true; widget = 0; } @@ -29,7 +30,23 @@ bool MoveWidget::eventFilter(QObject *watched, QEvent *event) //计算坐标偏移值,调用move函数移动过去 int offsetX = mouseEvent->pos().x() - lastPoint.x(); int offsetY = mouseEvent->pos().y() - lastPoint.y(); - widget->move(widget->x() + offsetX, widget->y() + offsetY); + int x = widget->x() + offsetX; + int y = widget->y() + offsetY; + if (inControl) { + //可以自行调整限定在容器中的范围,这里默认保留20个像素在里面 + int offset = 20; + bool xyOut = (x + widget->width() < offset || y + widget->height() < offset); + bool whOut = false; + QWidget *w = (QWidget *)widget->parent(); + if (w != 0) { + whOut = (w->width() - x < offset || w->height() - y < offset); + } + if (xyOut || whOut) { + return false; + } + } + + widget->move(x, y); } else if (mouseEvent->type() == QEvent::MouseButtonRelease && pressed) { pressed = false; } @@ -50,3 +67,8 @@ void MoveWidget::setLeftButton(bool leftButton) { this->leftButton = leftButton; } + +void MoveWidget::setInControl(bool inControl) +{ + this->inControl = inControl; +} diff --git a/movewidget/movewidget.gif b/movewidget/movewidget.gif deleted file mode 100644 index b98ab44..0000000 Binary files a/movewidget/movewidget.gif and /dev/null differ diff --git a/movewidget/movewidget.h b/movewidget/movewidget.h index a8e23cb..a25150b 100644 --- a/movewidget/movewidget.h +++ b/movewidget/movewidget.h @@ -34,11 +34,14 @@ private: QPoint lastPoint; //最后按下的坐标 bool pressed; //鼠标是否按下 bool leftButton; //限定鼠标左键 + bool inControl; //限定在容器内 QWidget *widget; //移动的控件 public Q_SLOTS: //设置是否限定鼠标左键 void setLeftButton(bool leftButton); + //设置是否限定不能移出容器外面 + void setInControl(bool inControl); //设置要移动的控件 void setWidget(QWidget *widget); };