46 lines
1.6 KiB
C++
46 lines
1.6 KiB
C++
#include <QCustomPlot.h>
|
|
#include <QMouseEvent>
|
|
#include <QPointF>
|
|
#include <cmath>
|
|
#include <QDebug>
|
|
|
|
class DraggablePixmap : public QCPItemPixmap {
|
|
Q_OBJECT
|
|
public:
|
|
DraggablePixmap(QCustomPlot *parentPlot) : QCPItemPixmap(parentPlot) {
|
|
setSelectable(true); // 确保项是可选的,这对于接收鼠标事件很重要
|
|
}
|
|
|
|
protected:
|
|
bool mDragging = false;
|
|
QPointF mDragStart; // 拖拽开始时的位置
|
|
|
|
void mousePressEvent(QMouseEvent *event, const QPointF &pos) {
|
|
QCPItemPixmap::mousePressEvent(event, pos); // 调用基类的处理函数
|
|
if (event->button() == Qt::LeftButton) { // 仅当左键被按下时开始拖拽
|
|
mDragging = true;
|
|
mDragStart = pos; // 记录当前位置作为起始点
|
|
}
|
|
}
|
|
|
|
void mouseMoveEvent(QMouseEvent *event, const QPointF &pos) override {
|
|
QCPItemPixmap::mouseMoveEvent(event, pos); // 调用基类的处理函数
|
|
if (mDragging) {
|
|
// 计算新的位置并更新项的位置
|
|
double dx = pos.x() - mDragStart.x();
|
|
double dy = pos.y() - mDragStart.y();
|
|
qDebug() << "QCPItemPixmap mouseMoveEvent:" << QString::number(dx) << ":" << QString::number(dy);
|
|
|
|
//this->setPos(/*position().x() + */dx, /*position().y() +*/ dy); // 更新项的位置
|
|
}
|
|
}
|
|
|
|
void mouseReleaseEvent(QMouseEvent *event, const QPointF &pos) override {
|
|
QCPItemPixmap::mouseReleaseEvent(event, pos); // 调用基类的处理函数
|
|
if (event->button() == Qt::LeftButton) { // 仅当左键被释放时停止拖拽
|
|
mDragging = false;
|
|
}
|
|
}
|
|
};
|
|
|