当前位置: 首页 > news >正文

Qt中的事件

写一个 可以拖动的按钮

DraggablePushButton.h 头文件

#ifndef DRAGGABLEPUSHBUTTON_H
#define DRAGGABLEPUSHBUTTON_H#include <QPushButton>
#include <QMouseEvent>class DraggablePushButton : public QPushButton
{Q_OBJECTpublic: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!");
}

 

http://www.lryc.cn/news/535604.html

相关文章:

  • 变化检测相关论文可读list
  • Ansible中playbook的变量
  • 亚信安全正式接入DeepSeek
  • 相似性图相关性重构网络用于无监督跨模态哈希
  • 【Bug】属性 PackageVersion 应在所有目标框架中具有单个值,但却具有以下值
  • C++ Primer 类型转换
  • 【CS61A 2024秋】Python入门课,全过程记录P7(Week13 Macros至完结)【完结撒花!】
  • SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)
  • LabVIEW用户界面设计原则
  • Datawhale 数学建模导论二 2025年2月
  • SQL CASE表达式的用法
  • 趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统
  • win32汇编环境,窗口程序使用跟踪条(滑块)控件示例一
  • mars3d接入到uniapp的时候ios上所有地图的瓦片都无法加载解决方案
  • 使用 Notepad++ 编辑显示 MarkDown
  • wordpress主题制作
  • MybatisPlus常用增删改查
  • Citus的TPCC、TPCH性能测试
  • 蓝桥杯---颜色分类(leetcode第75题)题解
  • C语言基础13:循环结构 for和while
  • 六西格玛设计培训如何破解风电设备制造质量与成本困局
  • 【Android开发】安卓手机APP使用机器学习进行QR二维码识别
  • Zabbix-监控SSL证书有效期
  • 生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 上
  • Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统
  • 基于进化式大语言模型的下一代漏洞挖掘范式:智能对抗与自适应攻防体系
  • 游戏引擎学习第99天
  • 脉冲当量含义
  • docker compose部署flink集群
  • docker compose快速部署kafka-connect集群