通用移动类,目标就是为了实现放入任意的控件之后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景很是多,好比在地图上放置的设备,须要用户自行按下拖动到指定的合适的位置,而后保存设备的位置坐标到数据库,下次打开直接加载,在一些安防项目、电力项目、环境监测等上面大量运用,有时候设备对应了多种类型,之前作的办法是将这个移动的代码直接封装在对应设备的自定义控件中,有个巨大缺点就是若是再新增长一个控件,又须要重复的代码加到控件中才行,能否将这个功能独立出来,只要传入控件就行呢,固然能够,好比我写过不少自定义控件,如今须要控件放到某个容器中能自由拖动,只须要new出通用移动类来就行。 项目开源地址:https://gitee.com/feiyangqingyun/QWidgetDemolinux
#ifndef MOVEWIDGET_H #define MOVEWIDGET_H /** * 通用控件移动类 做者:feiyangqingyun(QQ:517216493) 2019-9-28 * 1:能够指定须要移动的widget * 2:可设置是否限定鼠标左键拖动 * 3:支持任意widget控件 */ #include <QWidget> #ifdef quc #if (QT_VERSION < QT_VERSION_CHECK(5,7,0)) #include <QtDesigner/QDesignerExportWidget> #else #include <QtUiPlugin/QDesignerExportWidget> #endif class QDESIGNER_WIDGET_EXPORT MoveWidget : public QObject #else class MoveWidget : public QObject #endif { Q_OBJECT public: explicit MoveWidget(QObject *parent = 0); protected: bool eventFilter(QObject *watched, QEvent *event); private: QPoint lastPoint; //最后按下的坐标 bool pressed; //鼠标是否按下 bool leftButton; //限定鼠标左键 QWidget *widget; //移动的控件 public Q_SLOTS: //设置是否限定鼠标左键 void setLeftButton(bool leftButton); //设置要移动的控件 void setWidget(QWidget *widget); }; #endif // MOVEWIDGET_H
#include "movewidget.h" #include "qevent.h" #include "qdebug.h" MoveWidget::MoveWidget(QObject *parent) : QObject(parent) { lastPoint = QPoint(0, 0); pressed = false; leftButton = true; widget = 0; } bool MoveWidget::eventFilter(QObject *watched, QEvent *event) { if (widget != 0 && watched == widget) { QMouseEvent *mouseEvent = (QMouseEvent *)event; if (mouseEvent->type() == QEvent::MouseButtonPress) { //若是限定了只能鼠标左键拖动则判断当前是不是鼠标左键 if (leftButton && mouseEvent->button() != Qt::LeftButton) { return false; } //判断控件的区域是否包含了当前鼠标的坐标 if (widget->rect().contains(mouseEvent->pos())) { lastPoint = mouseEvent->pos(); pressed = true; } } else if (mouseEvent->type() == QEvent::MouseMove && pressed) { //计算坐标偏移值,调用move函数移动过去 int offsetX = mouseEvent->pos().x() - lastPoint.x(); int offsetY = mouseEvent->pos().y() - lastPoint.y(); widget->move(widget->x() + offsetX, widget->y() + offsetY); } else if (mouseEvent->type() == QEvent::MouseButtonRelease && pressed) { pressed = false; } } return QObject::eventFilter(watched, event); } void MoveWidget::setWidget(QWidget *widget) { if (this->widget == 0) { this->widget = widget; this->widget->installEventFilter(this); } } void MoveWidget::setLeftButton(bool leftButton) { this->leftButton = leftButton; }