qt中鼠标拖动qpushbutton与label


#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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值