Qt中的事件

写一个 可以拖动的按钮

DraggablePushButton.h 头文件

cpp 复制代码
#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

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!");
}
相关推荐
qq_4336184410 天前
qt 事件的传递顺序
qt事件