qt 图形视图框架 事件处理

Qt 的图形视图框架(Graphics View Framework)提供了一套丰富的类来管理大量的自定义 2D 图形项(QGraphicsItem),以及这些图形项之间的交互和事件处理。在这个框架中,事件处理是一个关键部分,它允许你响应各种用户输入,如鼠标点击、键盘操作、鼠标移动和悬停等。通过键盘处理的话,需要设置焦点,在QGraphicsScene中使用setFoucesItem()函数可以设置焦点,或者图形项使用setFouce()获取焦点。

一、事件处理机制

在 Qt 的图形视图框架中,事件处理主要通过以下几个关键类进行:

  1. QGraphicsScene:负责管理所有图形项(QGraphicsItem)的容器。虽然它本身不直接处理事件,但它会将事件传递给场景中的图形项。

  2. QGraphicsItem:是图形项的基类,所有自定义图形项都应该继承自这个类。QGraphicsItem 提供了许多与事件处理相关的虚函数,如 mousePressEventmouseMoveEventmouseReleaseEventhoverEnterEventhoverMoveEvent 和 hoverLeaveEvent 等。

  3. QGraphicsView:是显示 QGraphicsScene 内容的窗口部件。它负责处理视口(viewport)中的事件,并将这些事件转换为场景中的坐标,然后传递给 QGraphicsScene,再由 QGraphicsScene 将事件传递给适当的 QGraphicsItem。

二、主要事件

1、鼠标事件

item.h

#ifndef ITEM_H
#define ITEM_H#include<QGraphicsItem>
#include<QGraphicsScene>
#include<QGraphicsView>
#include<QMouseEvent>class Item : public QGraphicsItem
{
public:Item();QRectF boundingRect() const;void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget );void mouseMoveEvent(QGraphicsSceneMouseEvent *event) ;//鼠标移动事件void mousePressEvent(QGraphicsSceneMouseEvent *event) ;//鼠标点击事件void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) ;//鼠标松开事件void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) ;//鼠标双击事件
private:QColor color;//颜色
};#endif // ITEM_H

item.cpp

#include "item.h"Item::Item()
{color=QColor(Qt::black);//默认为黑色}
QRectF Item::boundingRect() const
{qreal penwidget=1;return QRectF(-penwidget/2,-penwidget/2,100+penwidget,100+penwidget);
}
void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{painter->setBrush(color);painter->drawRect(0,0,100,100);//画矩形
}
void Item::mouseMoveEvent(QGraphicsSceneMouseEvent *event) //鼠标移动事件
{color=QColor(Qt::green);update();
}
void Item::mousePressEvent(QGraphicsSceneMouseEvent *event) //鼠标点击事件
{setFocus();//设置焦点color=QColor(Qt::red);update();
}
void Item::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) //鼠标松开事件
{color=QColor(Qt::yellow);update();
}
void Item::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) //鼠标双击事件
{color=QColor(Qt::blue);update();
}

2、停靠事件

默认情况下,不会接收悬停事件,需要使用setAcceptHoverEvents()开启接收悬停事件。

#include "item.h"Item::Item()
{color=QColor(Qt::black);//默认为黑色setAcceptHoverEvents(true);//开启接收悬停
}QRectF Item::boundingRect() const
{qreal penwidget=1;return QRectF(-penwidget/2,-penwidget/2,100+penwidget,100+penwidget);
}void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{painter->setBrush(color);painter->drawRect(0,0,100,100);//画矩形
}
void Item::hoverMoveEvent(QGraphicsSceneHoverEvent *event) //悬停移动
{color=QColor(Qt::green);//绿色update();
}
void Item::hoverEnterEvent(QGraphicsSceneHoverEvent *event) //悬停输入
{
}void Item::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) //悬停离开
{color=QColor(Qt::blue);//蓝色update();
}

3、键盘事件

注意:

  • 使用键盘事件的控件需要获取焦点,QGraphicsItem的话使用 setFocus()开启。
  • 需要使用setFlag()函数开启标志。
QGraphicsItem::ItemIsMovable支持使用鼠标进行交互式移动。通过单击该项目然后拖动,该项目将与鼠标光标一起移动。
QGraphicsItem::ItemIsSelectable支持选择。启用此功能将启用 setSelected() 来切换项目的选择。
QGraphicsItem::ItemIsFocusable该项支持键盘输入焦点(即,它是输入项)。启用此标志将允许项目接受焦点
QGraphicsItem::ItemClipsToShape项目将剪辑到其自己的形状。该项目无法绘制或接收鼠标、平板电脑、拖放或将事件悬停在其形状之外。默认情况下处于禁用状态
QGraphicsItem::ItemClipsChildrenToShap项目将其所有后代的绘画剪辑成自己的形状。作为此项目的直接或间接子项的项不能在此项的形状之外绘制。
QGraphicsItem::ItemIgnoresTransformations项目忽略继承的变换,此标志可用于使文本标签项保持水平且不缩放,因此在转换视图时它们仍可读。
#include "item.h"Item::Item()
{color=QColor(Qt::black);//默认为黑色setFlag(QGraphicsItem::ItemIsFocusable);//设置标志}QRectF Item::boundingRect() const
{qreal penwidget=1;return QRectF(-penwidget/2,-penwidget/2,100+penwidget,100+penwidget);
}void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{painter->setBrush(color);painter->drawRect(0,0,100,100);//画矩形
}void Item::keyPressEvent(QKeyEvent *event) //键盘点击
{if(event->key()==Qt::Key_Up)//向上{moveBy(0,-10);}else if(event->key()==Qt::Key_Down)//向下{moveBy(0,10);}else if(event->key()==Qt::Key_Left)//向左{moveBy(-10,0);}else if(event->key()==Qt::Key_Right)//向右{moveBy(10,0);}else{}
}
void Item::mousePressEvent(QGraphicsSceneMouseEvent *event)
{setFocus();//设置焦点
}

4、拖曳事件

注意:

  • 默认不会开启拖拽,需要使用  setAcceptDrops(true)开启
  • 想要实现拖动控件的话还要开启 setFlag(QGraphicsItem::ItemIsMovable);
#include "item.h"Item::Item()
{color=QColor(Qt::black);//默认为黑色setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);//设置标志setAcceptDrops(true);//开启拖拽
}QRectF Item::boundingRect() const
{qreal penwidget=1;return QRectF(-penwidget/2,-penwidget/2,100+penwidget,100+penwidget);
}void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{painter->setBrush(color);painter->drawRect(0,0,100,100);//画矩形
}

5、上下文菜单事件

contextMenuEvent()重新实现此事件处理程序以处理上下文菜单事件
#include "item.h"Item::Item()
{color=QColor(Qt::black);//默认为黑色setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);//设置标志setAcceptDrops(true);//开启拖拽
}QRectF Item::boundingRect() const
{qreal penwidget=1;return QRectF(-penwidget/2,-penwidget/2,100+penwidget,100+penwidget);
}void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{painter->setBrush(color);painter->drawRect(0,0,100,100);//画矩形
}void Item::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{QMenu menu;QAction *red = menu.addAction("red");QAction *yellow = menu.addAction("yellow");QAction *green = menu.addAction("green");QAction *blue = menu.addAction("blue");QObject::connect(red,&QAction::triggered,[=](){color = Qt::red;update();});QObject::connect(yellow,&QAction::triggered,[=](){color = Qt::yellow;update();});QObject::connect(green,&QAction::triggered,[=](){color = Qt::green;update();});QObject::connect(blue,&QAction::triggered,[=](){color = Qt::blue;update();});menu.exec(event->screenPos());
}

qq群交流:698593923

觉得有帮助的话,打赏一下呗。。

           

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如意控物联网项目-ML307R模组软件及硬件调试环境搭建

软件及硬件调试环境搭建 1、 软件环境搭建及编译 a) 打开官方SDK&#xff0c;内涵APP-DEMO&#xff0c;通过vscode打开程序&#xff0c; 软件程序编写及编译参考下边说明文档链接 OneMO线上服务平台 编译需预安装python3.7以上版本&#xff0c;安装完python后&#xff0c;打开…

微信小程序使用scroll-view 加上enable-flex之后高度变得特别长

横向滚动给scroll-view标签加上了display:flex的样式后高度变得很长。 可以在设置align-items: flex-start;可解决这个问题。 或者给scroll-view下的标签加上height: fit-content;

普密斯在线图像测量仪:为质量把关助力

质量是企业的生命线&#xff0c;普密斯在线图像测量仪是质量把关的得力助手。 在产品生产过程中&#xff0c;它持续不断地对产品进行测量监控。一旦发现尺寸偏差超出允许范围&#xff0c;就会及时发出警报。 在塑料制品生产中&#xff0c;它可以确保每个塑料制品的厚度、长度等…

Altium Designer板框提取工具

这个工具用于提取Altium Designer的PCB文档的边框&#xff0c;支持输出为PCBDOC、SVG、AI、VSDX、PDF、DWG、DXF、HTML这几种矢量格式的图形文件&#xff0c;JPG、PNG、BMP、GIF、EMF这几种非矢量格式的图像文件&#xff0c;CSV和TXT格式的点阵文件。可以将PCB的廓落提取出来复…

【最新发布】Win10 22H2 19045.4957 正式版免费下载!

今日系统之家小编给大家分享2024年9月第二次更新的Windows10 22H2正式版系统&#xff0c;该版本系统基于最新Windows10 22H2 19045.4957 64位专业版进行离线制作&#xff0c;安全无毒&#xff0c;修复了使用某些环绕声技术时某些媒体的播放可能会停止等多项问题&#xff0c;系统…

pyQt 退出报:进程已结束,退出代码为 -1073740791 (0xC0000409)

摘要 我在调试pyQT的时候发现结束线程后会出现&#xff0c;进程已结束&#xff0c;退出代码为 -1073740791 (0xC0000409)&#xff0c;这个错误&#xff0c;排查了一星期才发现问题在哪里&#xff0c;特此记录 解决方案 进程已结束&#xff0c;退出代码为 -1073740791 (0xC00…

探索 DaPy:Python 中的 AI 数据处理新贵

文章目录 探索 DaPy&#xff1a;Python 中的 AI 数据处理新贵背景介绍DaPy 是什么&#xff1f;如何安装 DaPy&#xff1f;DaPy 的简单函数使用方法加载数据数据筛选数据聚合数据可视化自定义函数 DaPy 在实际场景中的应用数据预处理数据分析数据处理与集成 常见 Bug 及解决方案…

【JavaEE“多线程进阶”】——各种“锁”大总结

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c; 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;乐观锁和悲观锁 1&#xff1a;乐观锁 2&#xff1a;悲观锁 3&#xff1a;总结 二&am…

【工具分享】BarRax勒索病毒解密工具

前言 BarRax勒索软件首次出现于2017年&#xff0c;迅速在全球范围内扩散&#xff0c;主要针对Windows操作系统用户进行攻击。它通过使用AES-256和RSA-2048加密算法对受害者的文件进行加密&#xff0c;使文件变得不可访问。BarRax通常通过恶意电子邮件附件或伪装的软件下载进行…

【LeetCode】每日一题 2024_9_29 买票需要的时间(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 昨天的每日一题是线段树二分&#xff0c;题目难度远超我的能力范围&#xff0c;所以更不出来了 题目&#xff1a;买票需要的时间 代码与解题思路 func timeRequiredToBuy(tickets []int, k int) (sum in…

VisualGLM-6B——原理与部署

VisualGLM-6B技术原理介绍 VisualGLM-6B 是一种多模态预训练模型&#xff0c;它旨在将视觉和语言模型进行结合&#xff0c;使得语言模型能够理解图像信息并与文本对话无缝结合。为了更好地理解 VisualGLM-6B 的内容&#xff0c;我们可以从以下几个方面来解析它的原理、结构、训…

Mac小白必看,快速帮助新手入门的五款软件

刚转MacOS的小白是不是还不知道如何选择软件&#xff0c;MacOS与win有着很大的区别&#xff0c;对于新手来说&#xff0c;想要快速上手Mac的使用&#xff0c;少不了一款好的软件工具&#xff0c;今天给大家推荐五款适合刚转Mac的小白使用的好用工具。 1. iShot&#xff1a;截图…

IPD变革中,数据治理是关键

IPD变革中&#xff0c;数据治理是关键 2024-09-29 14:41汉捷咨询 华为轮值董事长徐直军先生在回顾IPD变革时&#xff0c;提到&#xff1a;“华为IPD变革前期&#xff0c;对数据的关注不够&#xff0c;没有系统梳理产品的信息架构和数据标准&#xff0c;也没有对业务流中的数据…

国内旅游:现状与未来趋势分析

在当今社会快速发展的背景下&#xff0c;国内旅游更是呈现出蓬勃的发展态势。中国&#xff0c;这片拥有悠久历史、灿烂文化和壮丽山河的广袤土地&#xff0c;为国内旅游的兴起与发展提供了得天独厚的条件。 本报告将借助 DataEase 强大的数据可视化分析能力&#xff0c;深入剖…

数据库入门不再难:克服学习障碍的实用技巧与演示

文章目录 摘要引言常见的学习困难及解决方法理解抽象的数据库概念SQL语句的构建与优化理解事务与并发控制 实用的学习技巧与工具推荐推荐学习资源数据库设计与实践的常用技巧 实战演练常见问题解答总结未来展望参考资料 摘要 数据库学习对于初学者来说&#xff0c;往往会面临诸…

优思学院|六西格玛黑带是什么?取得六西格玛黑带证书有何作用?

1. 六西格玛黑带是什么&#xff1f; 六西格玛黑带&#xff08;Black Belt&#xff09;是六西格玛项目中的高级专业人员&#xff0c;负责领导跨职能团队&#xff0c;使用统计分析工具和方法&#xff0c;深入分析业务流程中的问题并制定改进方案。黑带要具备扎实的六西格玛知识&…

HTTP协议代码实现

目录 一. 服务端模块实现 二. HTTP协议模块实现 2.1 HTTP请求部分&#xff1a; 2.2 HTTP响应部分&#xff1a; 2.3 工厂类部分&#xff1a; 2.4 HTTP服务端部分&#xff1a; 2.5 回头处理业务处理函数&#xff1a; 三. 调用服务端模块实现 四. 具体效…

【含文档】基于Springboot+Vue的高校奖助学金系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

柯桥学英语商务口语中老外最爱说的“what‘s up“是什么意思?回答错超尴尬!

“Whats up&#xff1f;” 在看美剧或者和老外聊天的时候 我们总能听到这句话 那你知道这句老外很爱说的 “whats up”是什么意思吗&#xff1f; 快和小编一起来学习吧~ 01 whats up 怎么理解&#xff1f; 很多人觉得Whats up就是更地道的“How are you”&#xff0c;嗯………

【vue3】防抖与节流

1.防抖 &#xff08;多次触发 只执行最后一次&#xff09; 作用&#xff1a; 高频率触发的事件,在指定的单位时间内&#xff0c;只响应最后一次&#xff0c;如果在指定的时间内再次触发&#xff0c;则重新计算时间防抖类似于英雄联盟回城6秒&#xff0c;如果回城中被打断&…