Qt - 鼠标事件

2023-11-01

欢迎转载,请注明出处:https://blog.csdn.net/qq_39453936?spm=1010.2135.3001.5343
原文链接: https://blog.csdn.net/qq_39453936/article/details/120784898


QMouseEvent的详细描述

  • 在小部件内按下或释放鼠标按钮或移动鼠标光标时,会发生鼠标事件。
  • 只有在按下鼠标按钮时才会发生鼠标移动事件,除非使用QWidget::setMouseTracking()启用了鼠标跟踪。
  • 当在小部件内按下鼠标按钮时,Qt自动抓取鼠标;小部件将继续接收鼠标事件,直到释放最后一个鼠标按钮。
    注意:Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击、释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理。
  • 鼠标事件包含一个特殊的接受标志flag,指示接收者是否需要该事件。如果小部件未处理鼠标事件,则应调用ignore()。鼠标事件沿父窗口小部件链向上传播,直到窗口小部件使用accept()接受鼠标事件,或者事件筛选器使用鼠标事件。
    注意:如果将鼠标事件传播到为其设置了Qt::WA_NoMousePropagation的小部件,则该鼠标事件将不会进一步传播到父小部件链的上游。
  • 通过调用从QInputEvent继承的modifiers()函数,可以找到键盘键值的状态。
  • 函数pos()、x()和y()给出光标相对于接收鼠标事件的小部件的位置。如果由于鼠标事件而移动小部件,请使用globalPos()返回的全局位置来避免抖动。
  • QWidget::setEnabled()函数可用于启用或禁用小部件的鼠标和键盘事件。
  • 需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:
    QWidget::mousePressEvent()
    QWidget::mouseReleaseEvent()
    QWidget::mouseDoubleClickEvent()
    QWidget::mouseMoveEvent()
    

QMouseEvent 相关使用

QMouseEvent::QMouseEvent(QEvent::Type type, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::MouseEventSource source)

构造鼠标事件对象。

类型参数必须是QEvent::MouseButtonPress、QEvent::MouseButtonRelease、QEvent::MouseButtonDblClick或QEvent::MouseMove。

localPos、windowPos和screenPos点分别指定鼠标光标相对于接收小部件或项目、窗口和屏幕的位置。

导致事件的按钮作为Qt::MouseButton枚举中的值提供。如果事件类型为MouseMove,则此事件的相应按钮为Qt::NoButton。按钮是事件发生时所有按钮的状态,修饰符是所有键盘修饰符的状态。

事件的源由源指定。

  • Qt::MouseButton QMouseEvent::button() const
    返回导致事件的按钮。
    请注意,对于鼠标移动事件,返回的值始终为Qt::NoButton。

  • Qt::MouseButtons QMouseEvent::buttons() const
    返回生成事件时的按钮状态。按钮状态是使用OR运算符的Qt::LeftButton、Qt::RightButton、Qt::MidButton的组合。对于鼠标移动事件,这是所有按下的按钮。对于鼠标按下和双击事件,这包括导致事件的按钮。对于鼠标释放事件,这不包括导致事件的按钮。

鼠标按下事件mousePressEvent

[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)

可以在子类中重新实现该事件处理程序,以接收小部件的鼠标按下事件。示例:

void Widget::mousePressEvent(QMouseEvent *event)
{
	//如果鼠标左键按下
    if (event->button() == Qt::LeftButton) {
    	//获取鼠标在事件接收者中的位置pos
        lastPoint = event->pos();
    }
	// 如果是鼠标右键按下
	else if(event->button() == Qt::RightButton)
	{
	   //···
	}  
}

鼠标移动事件mouseMoveEvent

[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)

可以在子类中重新实现这个事件处理程序,以接收小部件的鼠标移动事件。如果关闭鼠标跟踪,则只有在移动鼠标时按下鼠标按钮,才会发生鼠标移动事件。如果打开鼠标跟踪setMouseTracking(true); ,即使未按下鼠标按钮,也会发生鼠标移动事件。
每当您移动小部件以响应鼠标事件时,globalPos()可能与当前指针位置QCursor::pos()和QWidget::mapToGlobal(pos())有很大不同。
示例:

void ScribbleArea::mouseMoveEvent(QMouseEvent *event)
{
	// 这里必须使用buttons()
    if ((event->buttons() & Qt::LeftButton) && scribbling)
    {
    	//···
    }
}

鼠标释放事件mouseReleaseEvent

[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)

可以在子类中重新实现这个事件处理程序,以接收小部件的鼠标释放事件。
示例:

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
   if (event->button() == Qt::LeftButton) {
          lastPoint = event->pos();
      }
}

QWheelEvent

鼠标滚轮事件

void Widget::wheelEvent(QWheelEvent *event)
{  
    if(event->delta() > 0)// 当滚轮远离使用者时
    {
        ···
    }
    else//当滚轮向使用者方向旋转时
    {
        ···
    }
}

鼠标移入移出事件

  • [virtual protected] void QWidget::enterEvent(QEvent *event)

  • [virtual protected] void QWidget::leaveEvent(QEvent *event)

此事件处理程序可以在子类中重新实现,以接收在事件参数中传递的小部件进入或离开事件。示例:

void Widget::enterEvent(QEvent *)
{
    qDebug()<<"鼠标移入";
}
void Widget::leaveEvent(QEvent *)
{
   qDebug()<<"鼠标移出";
}

参考文章:https://blog.csdn.net/liyuanbhu/article/details/53710249
小白发文,欢迎指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt - 鼠标事件 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐

  • linux默认系统进程

    http blog chinaunix net uid 7553302 id 64864 html linux启动后 默认有以下系统进程 Init 1 Linux的第一个进程 也是其它所有进程的父进程 events 0 5 处理内核事件守护
  • Python生成器推导式创建元组

    从形式上看 生成器推导式与列表推导式类似 只是生成器推导式使用小括号 列表推 导式直接生成列表对象 生成器推导式生成的不是列表也不是元组 而是一个生成器对象 我们可以通过生成器对象 转化成列表或者元组 也可以使用生成器对象的 next 方法
  • mysql存储引擎性能比较

    前言 今天看到有人面滴滴被问到知不知道mysql的引擎然后说不会被直接告知面试结束 然后想想自己mysql引擎也只是知道那么一两个还说不全 就想说在这里做个总结 凌晨三点半了 在数据库中存的就是一张张有着千丝万缕关系的表 所以表设计的好坏
  • git 合并多个commit(goland)

    用命令合并 commit 多多少少有点麻烦 发现一个更快速的方法 如何利用 goland 快速 合并多个commit 点击 goland 左下角 git 按钮 会显示你的 gitlog 下图是你的 gitlog 按住 ctrl 然后点击你想
  • Linux安装tomcat8详细步骤

    1 下载tomcat http tomcat apache org 我下载的是 apache tomcat 8 0 50 tar gz 2 用root用户登陆Linux 在usr local 下创建tomcat文件夹 mkdir usr l
  • Hill密码的加密与解密

    Hill密码原理 首先随机生成或选取一个密钥矩阵 该矩阵必须是可逆的 过程如下图所示 在加密过程中 先将明文分为三个字母一组 不足的用 X 代替 然后将其转化成数字 如0 A 得到每个字母所对应的数字 再与密钥矩阵相乘 得到的数字转成字母
  • BUCK/BOOST电路原理分析

    Buck变换器 也称降压式变换器 是一种输出电压小于输入电压的单管不隔离直流变换器 图中 Q为开关管 其驱动电压一般为PWM Pulse width modulaTIon脉宽调制 信号 信号周期为Ts 则信号频率为f 1 Ts 导通时间为T
  • python自动化写入word文件

    工具包使用python docx Github页面 https github com python openxml python docx 官网教程 https python docx readthedocs io en latest in
  • K8S的架构及工作原理

    1 Master和Node 1 Master K8S中的Master是集群控制节点 负责整个集群的管理和控制 在Master上运行着以下关键进程 kube apiserver 提供了HTTP Rest接口的关键服务进程 是K8S里所有资源的
  • unix 时间戳 c语言,C语言实现字符转unix时间戳

    在PHP中把字符串转成Unix时间戳是多么的方便 一个strtotime 函数就搞定了 而C语言实现就麻烦很多了 需要先转成tm类型 再得到它的Unix时间戳 附上实现代码 include include int strtotime cha
  • libcurl库的下载和安装

    目录 1 下载 2 解压 3 查看README 查看curl 1 4 查看INSTALL md 查看 configure help 5 配置configure 6 编译 拿下载安装libcurl库为例 1 下载 下载网址 单击一下这个文件
  • 算法入门篇:排序算法(一)

    引子 笔者刚刚学习自己的的一门编程语言 C语言 的时候 正在runoob上面刷经典一百道题 第一次见到排序问题 我内心是不屑的 这 不是张口就来 然后我就贡献了一整个下午的时间在一个简单的排序上面 初学者不知到排序的时候可以有交换两个值这样
  • js逆向_知识小结

    目录 一 Chrome之调试小结 chrome查看资源文件 chrome关联本地文件夹 chrome重写js文件并替换 chrome新建js文件并执行 Console打印输出勾选 断点 DOM 事件 xhr debugger 调用栈Call
  • Apex List

    请访问https trailhead salesforce com en users strailhead trailmixes prepare for your salesforce platform developer i creden
  • Probabilistic Knowledge Transfer for Deep Representation Learning(2018)----论文笔记

    Probabilistic Knowledge Transfer for Deep Representation Learning 写在前面 Abstract 1 Introduction 后续存在问题 本文提出的方法 优点 贡献 2 Re
  • BES2300x笔记(15) -- 提示音制作秘籍

    哈喽大家好 这是该系列博文的第十五篇 篇 lt lt 系列博文索引 快速通道 gt gt 一 前言 常见的TWS耳机产品中 我们极少会看到有LED灯指示 即便在板子上预留了LED 也只是用在调试阶段 实际量产时直接空贴 因为一个LED就足以
  • 【满分】【华为OD机试真题2023 JAVA&JS】最多等和不相交连续子序列

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 最多等和不相交连续子序列 知识点贪心 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的
  • java泛型代码编写

    java泛型代码编写 泛型的由来 我们先看下面这段代码 List list new ArrayList list add 24 向集合中添加一个 Integer 类型的数据 list add Tom 向集合中添加一个 String 类型的数
  • 美团笔试-小美的元素删除

    小美的元素删除 小美有一个数组 她希望删除k个元素 使得剩余的元素两两之间互为倍数关系 你能告诉小美有多少种删除方案吗 由于答案过大 请对10 9 7模 输入描述 第一行输入两个整数n k 1 lt k lt n lt 10 3 表示数组长
  • Qt - 鼠标事件

    欢迎转载 请注明出处 https blog csdn net qq 39453936 spm 1010 2135 3001 5343 原文链接 https blog csdn net qq 39453936 article details