当前在做的一个小工具需要插入标签,如果在插入的时候要求用户填写位置标签位置,对操作人员要求就有点高了,所以要做一个可以使用鼠标拖动的标签.
过程很简单,记录以下.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;
}