Qt中的事件
写一个 可以拖动的按钮
DraggablePushButton.h 头文件
#ifndef DRAGGABLEPUSHBUTTON_H
#define DRAGGABLEPUSHBUTTON_H
#include <QPushButton>
#include <QMouseEvent>
class DraggablePushButton : public QPushButton
{
Q_OBJECT
public:
explicit DraggablePushButton(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private:
void showDialog();
private:
QPoint m_pressPosition; // 鼠标按下位置
int m_pressTime; // 鼠标按下时间戳
bool m_isDragging; // 是否是拖动操作
};
#endif // DRAGGABLEPUSHBUTTON_H
实现 DraggablePushButton.cpp
#include "DraggablePushButton.h"
#include <QMessageBox>
#include <QApplication>
#include <QDebug>
DraggablePushButton::DraggablePushButton(QWidget *parent)
: QPushButton(parent), m_isDragging(false)
{
}
void DraggablePushButton::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_pressPosition = event->pos(); // 记录鼠标按下的位置
m_pressTime = event->timestamp(); // 记录鼠标按下的时间
// 阻止默认的点击行为
event->accept();
}
else {
QPushButton::mousePressEvent(event); // 其它鼠标按下事件处理
}
}
void DraggablePushButton::mouseMoveEvent(QMouseEvent *event)
{
if (m_isDragging) {
// 鼠标拖动时更新按钮位置
QPoint delta = event->pos() - m_pressPosition;
move(pos() + delta); // 移动按钮
event->accept();
}
else {
// 判断是否是拖动操作
int distance = (event->pos() - m_pressPosition).manhattanLength();
if (distance > QApplication::startDragDistance()) {
m_isDragging = true; // 开始拖动
}
}
}
void DraggablePushButton::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
int releaseTime = event->timestamp(); // 记录释放的时间
int timeDiff = releaseTime - m_pressTime; // 计算按下和释放的时间差
if (m_isDragging) {
// 如果是拖动操作
qDebug() << "Dragged";
} else {
// 如果按下和释放的时间差较短,并且鼠标位置没有变化,判定为双击
if (timeDiff < QApplication::doubleClickInterval()) {
qDebug() << "Double Clicked";
showDialog(); // 弹出对话框
} else {
qDebug() << "Single Clicked";
}
}
m_isDragging = false; // 重置拖动标志
event->accept();
}
else {
QPushButton::mouseReleaseEvent(event); // 其它鼠标释放事件处理
}
}
void DraggablePushButton::showDialog()
{
// 弹出对话框
QMessageBox::information(this, "Double Clicked", "You double-clicked the button!");
}