五、【易 AI】鼠标事件与目标焦点

所谓辉煌的人生,不过是欲望的囚徒。

——叔本华

注:自本节开始,所有的示例都以 OpenGLWidget 实现,

一、鼠标事件

重写鼠标事件,

#ifndef MYOPENGL_H
#define MYOPENGL_H#include <QOpenGLWidget>
#include <QTimer>
#include <QMouseEvent>class MyOpenGL : public QOpenGLWidget
{
public:MyOpenGL(QWidget *parent = nullptr);
public slots:void onTimerUpdate();
protected:void initializeGL();void resizeGL(int w, int h);void paintGL();void mousePressEvent(QMouseEvent *event); // 鼠标点击事件void mouseMoveEvent(QMouseEvent *event); // 鼠标移动事件void mouseReleaseEvent(QMouseEvent *event); // 鼠标释放事件
private:QTimer * fpsTimer = nullptr;bool isPressed = false;
};#endif // MYOPENGL_H
#include "live2d/LAppDelegate.hpp"
#include "live2d/LAppView.hpp"
#include "live2d/LAppPal.hpp"
#include "live2d/LAppLive2DManager.hpp"
#include "live2d/LAppDefine.hpp"#include "myopengl.h"MyOpenGL::MyOpenGL(QWidget *parent):QOpenGLWidget{parent} {// 60 fpsfpsTimer = new QTimer(this);fpsTimer->start((1.0/60.0)*1000);connect(fpsTimer,&QTimer::timeout,this,&MyOpenGL::onTimerUpdate);
}void MyOpenGL::onTimerUpdate()
{update();
}void MyOpenGL::initializeGL(){LAppDelegate::GetInstance()->Initialize(this);
}void MyOpenGL::resizeGL(int w, int h){LAppDelegate::GetInstance()->resize(w,h);
}void  MyOpenGL::paintGL(){LAppDelegate::GetInstance()->update();
}void  MyOpenGL::mouseMoveEvent(QMouseEvent*e){LAppDelegate::GetInstance()->GetView()->OnTouchesMoved(e->x(),e->y());update();e->ignore();
}void  MyOpenGL::mousePressEvent(QMouseEvent*e){if(e->button() == Qt::LeftButton){isPressed = true;LAppDelegate::GetInstance()->GetView()->OnTouchesBegan(e->x(),e->y());}e->ignore();
}
void  MyOpenGL::mouseReleaseEvent(QMouseEvent*e){if(e->button() == Qt::LeftButton){isPressed = false;LAppDelegate::GetInstance()->GetView()->OnTouchesEnded(e->x(), e->y());update();}e->ignore();
}

效果如下,

二、实时追踪

窗口默认设置为不追踪鼠标移动,只有鼠标按键按下时才影响鼠标移动 mousePressEvent 事件,我们可以通过 setMouseTracking 方法调整为实时追踪,

setMouseTracking(true);
// ...MyOpenGL::MyOpenGL(QWidget *parent):QOpenGLWidget{parent} {// 60 fpsfpsTimer = new QTimer(this);fpsTimer->start((1.0/60.0)*1000);connect(fpsTimer,&QTimer::timeout,this,&MyOpenGL::onTimerUpdate);setMouseTracking(true);
}// ...

效果如下,

三、全屏追踪

全屏追踪的方案有两种:

  1. 窗口全屏(应用级)。重写 QT 的鼠标事件,是仅针对于当前窗口的鼠标捕获,一旦脱离了当前窗口,就没法捕获系统的鼠标事件。
  2. 使用系统钩子(系统级)。这种方法涉及到操作系统级别的编程,需要特殊权限和对应平台的 API 知识。

除了实现全屏追踪,我们还需要鼠标穿透到桌面来操作其他窗口,而应用级的鼠标穿透 Qt::WA_TransparentForMouseEvents 不会再接收系统级的鼠标事件。综合考虑,我们采用方案 2 实现全屏追踪。

1、鼠标钩子

#ifndef MYOPENGL_H
#define MYOPENGL_H#include <QOpenGLWidget>
#include <QTimer>
#include <QMouseEvent>
#include <Windows.h>
#include <QWindow>class MyOpenGL : public QOpenGLWidget
{
public:MyOpenGL(QWidget *parent = nullptr);static MyOpenGL* GetInstance();~MyOpenGL();void mouseMoveCallBack(float x,float y);void mouseReleaseCallBack(float x,float y);void mousePressCallBack(float x,float y);
public slots:void onTimerUpdate();
protected:void initFpsTimer();void initializeGL();void resizeGL(int

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/641228.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

鲁抗医药专属采购商城上线,携手隆道公司注入数字化采购新动能

近日&#xff0c;国内领先的医药制造企业——山东鲁抗医药股份有限公司&#xff08;以下简称鲁抗医药&#xff09;与隆道公司联手打造的鲁抗医药专属采购商城上线运行。该商城&#xff0c;通过整合鲁抗医药合作电商和合格供应商资源&#xff0c;创新商城化采供协同模式&#xf…

【Hello算法】 > 第 3 关 >栈与队列

数据结构 之 数组与链表 1 栈 / 栈的常见操作、实现、应用2 队列 /队列的常见操作、实现、应用3 双向队列4 Tips ———————————————————————————————————————————————————————————- ————————————————…

动手学大模型应用开发--Chapter 03搭建并使用向量数据库

文章目录 前言一、学习目标二、学习知识点概要2.1 什么是词向量2.2 词向量的意义2.3 文本转为词向量的方法 三、总结四、引申阅读 前言 本学习笔记为datawhale动手学大模型应用开发的第三章&#xff0c;学习链接为&#xff1a; https://datawhalechina.github.io/llm-universe…

系统启动修复和SYSTEM丢失损坏故障处理

系统启动修复和SYSTEM丢失损坏故障处理 一、问题描述 你的电脑/设备需要修复。无法加载应用程序或操作系统&#xff0c;原因是所需文件丢失或包含错误。 文件:\Windows\system32\winload.exe 错误代码: 0xc000000e 二、问题分析 1.查询winload.exe是win7或者win10以上系统…

算法竞赛相关问题总结记录

前言 日常在校生或者是工作之余的同学或多或少都会参加一些竞赛,参加竞赛一方面可以锻炼自己的理解与实践能力&#xff0c;也能够增加自己的生活费&#xff0c;竞赛中的一些方案也可以后续作为自己论文的base,甚至是横向课题的框架。在算法竞赛中算法的差别个人感觉差距都不大&…

Transformer - 时间特征的处理

Transformer - 时间特征的处理 flyfish ETTm1.csv有如下内容 假如有2016/7/1 0:45:00有这样的时间字符串&#xff0c;如何变成时间特征列表 from typing import Listimport numpy as np import pandas as pd from pandas.tseries import offsets from pandas.tseries.freq…

携程 Java 暑期实习一面:HashMap 的 key 可以设置为 null 吗?那 ConcurrentHashMap 呢?

更多大厂面试内容可见 -> http://11come.cn 携程 Java 暑期实习一面&#xff1a;HashMap 的 key 可以设置为 null 吗&#xff1f;那 ConcurrentHashMap 呢&#xff1f; Java 基础 1、Java 中有哪些常见的数据结构&#xff1f; 图片来源于&#xff1a;JavaGuide Java 中常…

【数学归纳法 反证法】菲蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff0c;Bzout’s identity&#xff09;得名于法国数学家艾蒂安裴蜀&#xff0c;说明了对任何整数a、b和它们的最大公约 数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且&…

【分治算法】Hanoi塔问题Python实现

文章目录 [toc]问题描述Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 a a a、 b b b、 c c c是三个塔座&#xff0c;开始时&#xff0c;在塔座 a a a上有一叠共 n n n个圆盘&#xff0c;这些圆盘…

LabVIEW连接PostgreSql

一、安装ODBC 下载对应postgreSQL版本的ODBC 下载网址&#xff1a;http://ftp.postgresql.org/pub/odbc/versions/msi/ 下载好后默认安装就行&#xff0c;这样在ODBC数据源中才能找到。 二、配置系统DSN 实现要新建好要用的数据库&#xff0c;这里的用户名&#xff1a;postg…

近年数一,数二难度如何,听说24是像张宇那样的题?

直接上分数&#xff01; “估分一百零几&#xff0c;平时李林130-140&#xff0c;张八110-125的样子&#xff0c;超越做的分数也是100出头。” 24学长说&#xff1a; “远离李林张八&#xff01;张四没做不评价。” “李林张八暑假前做完当作打基础即可。超越才是真题难度”…