Qt 实现拖动QLabel

当前在做的一个小工具需要插入标签,如果在插入的时候要求用户填写位置标签位置,对操作人员要求就有点高了,所以要做一个可以使用鼠标拖动的标签.
过程很简单,记录以下.qt不常用,下次用的时候又把过程思考一边很麻烦.

思路

使用QLabel派生一个自己的类,在派生类中重新定义以下几个鼠标事件相关的处理函数.

代码:

mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QObject>
#include <QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
signals:

private:
   // 是否可以拖动
    bool m_bDrag{false};  

   // 鼠标的位置
    QPoint prePos;
};

#endif // MYLABEL_H

mylabel.cpp

#include "mylabel.h"
#include <QMouseEvent>
#include <QDebug>

MyLabel::MyLabel(QWidget *parent)
    : QLabel{parent}
{

}

void MyLabel::mouseMoveEvent(QMouseEvent *event)
{
    if(false == m_bDrag){
        return;
    }
   // 鼠标的当前位置
    auto point = event->globalPos();
    
    // 计算标签的新位置(point - prePos)是鼠标较上次变化的量,标签也应该变化一样的量,所就在
    // 标签的当前量基础上加上变化量得到标签新的位置.
     auto newPos = this->pos() + (point - prePos);
    
    // 将标签移动到新的位置
     this->move(newPos);

    // 更新鼠标位置
     prePos = point;
}

void MyLabel::mousePressEvent(QMouseEvent *event)
{
    // 要求使用鼠标左键移动,如果不是鼠标左键直接return
    if(event->button() != Qt::LeftButton){
        return;
    }
   // 更新鼠标位置
    prePos = event->globalPos();
    m_bDrag = true;
}

void MyLabel::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() != Qt::LeftButton){
        return;
    }
    m_bDrag = false;
}

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容