QT实现鼠标拖拽Label

mousedialog.h

#ifndef MOUSEDIALOG_H
#define MOUSEDIALOG_H

#include <QDialog>
#include <QMouseEvent>

namespace Ui {
class MouseDialog;
}

class MouseDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MouseDialog(QWidget *parent = 0);
    ~MouseDialog();
private:
    //鼠标按下时执行的事件处理函数
    void mousePressEvent(QMouseEvent *event);
    //鼠标抬起时执行的事件处理函数
    void mouseReleaseEvent(QMouseEvent *event);
    //鼠标移动时执行的事件处理函数
    void mouseMoveEvent(QMouseEvent *event);
private:
    Ui::MouseDialog *ui;
    bool m_drag;//标记是否可以拖拽
    QPoint m_pos;//记录鼠标和label的相对位置
};

#endif // MOUSEDIALOG_H




mousedialog.cpp

#include "mousedialog.h"
#include "ui_mousedialog.h"

MouseDialog::MouseDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MouseDialog)
{
    ui->setupUi(this);
    m_drag = false;
}

MouseDialog::~MouseDialog()
{
    delete ui;
}
//鼠标按下时执行的事件处理函数
void MouseDialog::mousePressEvent(QMouseEvent *event)
{
    //是否为鼠标左键按下
    if(event->button() == Qt::LeftButton){
        //获取label所在矩形区域
        QRect rect = ui->label->frameRect();
        //坐标值平移,让rect和鼠标坐标系一致
        rect.translate(ui->label->pos());
        //判断鼠标点击位置是否在rect范围中
        if(rect.contains(event->pos())==true){
            m_drag = true;//标记可以执行拖拽操作
            m_pos = ui->label->pos()-event->pos();//记录lable和鼠标相对位置
        }
    }
}
//鼠标抬起时执行的事件处理函数
void MouseDialog::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){
        m_drag = false;
    }
}
//鼠标移动时执行的事件处理函数
void MouseDialog::mouseMoveEvent(QMouseEvent *event)
{
    if(m_drag == true){
        //计算label移动的新位置
        QPoint newPos = m_pos + event->pos();
        //设置label移动范围:不能超出父窗口
        QSize s1 = size();//获取窗口大小
        QSize s2 = ui->label->size();//获取label大小
        //x:最小值(0)最大值(窗口宽-label宽)
        if(newPos.x() < 0){
            newPos.setX(0);
        }
        else if(newPos.x() > s1.width()-s2.width()){
            newPos.setX(s1.width()-s2.width());
        }
        //y:最小值(0)最大值(窗口高-label高)
        if(newPos.y() < 0){
            newPos.setY(0);
        }
        else if(newPos.y() > s1.height()-s2.height()){
            newPos.setY(s1.height()-s2.height());
        }

        //移动label到新位置
        ui->label->move(newPos);
    }
}




main.cpp

#include "mousedialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MouseDialog w;
    w.show();

    return a.exec();
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值