#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QPoint>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget() override;
protected:
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private slots:
private:
Ui::Widget *ui;
bool drag;
QPoint pos;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include "mbtn.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->drag=false;
Mbtn *btn=new Mbtn(this);//需要构建类,在类中对鼠标事件重载
btn->setGeometry(100,100,80,30);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
//点击在按钮btn上,无法获取event->pos()
if(this->drag)
{
//计算lab要移动到的新位置
QPoint npos=event->pos()+this->pos;//一直补偿差值!!!!!
QSize s1=this->size();//窗口大小
QSize s2=ui->lab->size();//lab大小
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->lab->move(npos);//移动到新位置
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
//是否鼠标左键
if(event->button()==Qt::LeftButton)
{
//矩形区域
QRect rect=ui->lab->frameRect();//x,y,w,h //圈出矩形区域 不代表是lab的区域
//坐标平移,使得rect和鼠标在同一坐标系
//将矩形区域与lab的左上角重合!!!!!!设置为原点
rect.translate(ui->lab->pos());//窗口左上角为0,0,将lab坐标设置在窗口
//判断点击位置是否在矩形内
if(rect.contains(event->pos()))//判断的坐标是否矩形区域内!!!!!不是lab的坐标,位置等价而已!!
{
this->drag=true;
this->pos=ui->lab->pos()-event->pos();//存储位置差值,一直更新差值!!!!!!
}
}
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)//松开不可移动
{
this->drag=false;
}
}
按钮需要构建继承qpushbutton的类,在类中进行重载鼠标事件
#ifndef MBTN_H
#define MBTN_H
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
class Mbtn : public QPushButton
{
Q_OBJECT
public:
explicit Mbtn(QWidget *parent = nullptr);
protected:
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
signals:
private:
bool drag;
QPoint pos;
};
#endif // MBTN_H
#include "mbtn.h"
#include <QDebug>
Mbtn::Mbtn(QWidget *parent) : QPushButton(parent)
{
}
void Mbtn::mouseMoveEvent(QMouseEvent *event)
{
if(this->drag)
{
//计算btn要移动到的新位置
QPoint npos=event->pos()-this->pos;//现在的位置与原来位置差值
QPoint nposs =QPoint(this->x()+npos.x(),this->y()+npos.y());
//this是btn相对于widget的位置 坐标系是widget
this->move(nposs);//移动到新位置
qDebug()<<this->x()<<"this:x,y"<<this->y();
qDebug()<<event->x()<<"mouse:x,y"<<event->y();
}
}
void Mbtn::mousePressEvent(QMouseEvent *event)
{
//是否鼠标左键
if(event->button()==Qt::LeftButton)
{
this->drag=true;
this->pos=event->pos();//存储按键相对按钮的位置,坐标系是按钮
}
}
void Mbtn::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)//松开不可移动
{
this->drag=false;
}
}