问题的提出:

最近利用Graphics View Framework 实现一需求,其中要求鼠标按住QGraphicsWidget实现随意拖动,但调试发现鼠标、键盘的任何消息,QGraphicsWidget都无法响应,ItemIsMovable 、ItemIsSelectable 、ItemIsFocusable都已经通过如下代码设置:

setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsGeometryChanges | QGraphicsItem::ItemUsesExtendedStyleOption);

接受鼠标悬浮事件也设置为true:

setAcceptHoverEvents(true);

依然不响应鼠标键盘消息,即下面代码都不响应:

    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override;virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)   override;virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override;virtual void keyPressEvent(QKeyEvent *event) override;virtual void keyReleaseEvent(QKeyEvent *e) override;

经过艰苦排查,发现必须实现下面两个函数才能响应鼠标键盘消息:

QRectF CComponentLineWidget::boundingRect() const
{return QRectF(0, 0, 500, 500);
}QPainterPath CComponentLineWidget::shape() const
{QPainterPath path;path.addRect(boundingRect());return path;
}

其中CComponentLineWidget是QGraphicsWidget的派生子类。请注意:如果不实现shape函数,则shape函数默认返回的是QPainterPath为空的对象,只有鼠标落在一个由shape函数返回非空QPainterPath对象表示区域范围内时,才会接收鼠标、键盘消息。

总结:

要使QGraphicsItem、QGraphicsWidget响应鼠标、键盘消息,则必须满足:

  • 必须实现boundingRect()函数,且该函数返回的矩形区域不能过小。
  • 必须实现shape()函数,且该函数返回的QPainterPath对象不能为空,所表示的区域不能过小。
  • 通过setFlags函数设置ItemIsMovable 、ItemIsSelectable 、ItemIsFocusable表示。

QGraphicsWidget收不到鼠标、键盘消息解决相关推荐

  1. linux安装界面键盘失灵,安装win7鼠标键盘失灵怎么办_win7安装界面鼠标键盘失灵解决方法【147下载站】...

    相信许多用户在使用win7系统时都有遇到一些问题,有用户就有遇到安装win7鼠标键盘失灵的情况,那么遇到这个情况要怎么解决呢?鼠标键盘不能使用让我们操作起来很不方便,下面大家就一起来看看win7安装界 ...

  2. 联想G40-30进入PE鼠标键盘失灵解决方法

    LZ是联想G40-30,以前同学帮装系统的时候,就遇到了U盘启动进入PE后鼠标键盘都失灵了,无法操作,一直也没有解决.最近自己装时也是同样问题.就在网上找了一下,自己也试过多次,没有问题.其大概步骤如 ...

  3. 银河麒麟桌面V10SP1版本系统休眠唤醒鼠标键盘失效解决方法

    使用银河麒麟桌面系统有时会出现系统休眠后再唤醒,鼠标键盘失效的问题,可尝试以下方法解决. 1.检查是否安装 laptop-mode-tools 工具 执行命令: dpkg -l | grep lapt ...

  4. 全局钩子(hook鼠标键盘消息)

    生成DLL文件,模块定义文件为: LIBRARY Hook EXPORTS SetHook @2 实现文件如下.其中g_hWnd为所有进程共享,并且绕过了系统对可写数据的写时复制机制,维护的是一份拷贝 ...

  5. 【原创】CLEVO P157SM外接鼠标键盘失灵解决:更换硅脂(附带最新跑分数据)

    作者批注:本文允许转载,并且希望给搜索未来人类.蓝天.CLEVO.更换硅脂或者任何有关关键字的朋友提供帮助. 原文地址:http://www.cnblogs.com/c4isr/p/3514140.h ...

  6. C#使用LibVLC实现播放遇到无法全屏及鼠标键盘事件问题解决

    最近开发视频播放软件使用VLC实现流媒体播放,在使用libVLC自己进行集成播放控件时发现,播放窗口picturebox不响应鼠标键盘事件,无法进行双击或鼠标全屏播放功能的实现.原因是事件被vlc s ...

  7. Delphi下利用SendInput模拟鼠标键盘

    前言 发了一篇<Delphi下利用WinIo模拟鼠标键盘详解>(http://programbbs.com/bbs/view12-17207-1.htm),再发一个利用SendInput模 ...

  8. java 模拟键盘输入_Java 在windows 下模拟鼠标键盘的输入

    Java提供了一个很好的自动化测试类供我们去模拟鼠标键盘消息.以下是Robot的主要方法 Robot类的主要方法详细信息 1.mouseMove(int x,int y)将鼠标指针移动到给定屏幕坐标: ...

  9. Android系统模拟鼠标键盘详解

    转自:http://blog.sina.com.cn/s/blog_602f87700102uz8j.html 在Android系统下模拟鼠标键盘等输入设备,网络上资料非常多.但不少是人云亦云,甚至测 ...

最新文章

  1. poj2240(Bellman-ford)
  2. 你住的城市7.5亿年前长啥样?这张互动地图能让你看到
  3. 带你简单了解通信工程
  4. awk用法小结(作者总结)
  5. mybatis枚举自动转换(通用转换处理器实现)
  6. debian9为什么默认是pip2_Debian9 安装后基本配置
  7. web里如何在背景图片上放置div元素_2020年web前端开发经典面试题总结整理(建议收藏)...
  8. posix线程使用详解
  9. 考试用计算机反思800字,期中考试反思800字(5篇)
  10. Windows Xp Sp3官方简体中文版(原版) 纯净安装版 百度网盘下载
  11. 系统重温Pandas笔记:(八)文本数据
  12. JAVA中Object类中的equal方法
  13. 希尔伯特的23个问题
  14. 如何修改PPT文档的编辑版式
  15. 《python数据分析与挖掘实战》笔记第3章
  16. 关于产品的一些思考——腾讯之手机安全管家
  17. list redis 怎样做排行_Redis中5种数据结构的使用场景介绍
  18. cocos2d-LUA逆向之用idaPro调试so库获取xxtea解密key
  19. webrtc的DEMO环境搭建
  20. errdisabled 障碍处理

热门文章

  1. cc2530dma控制器功能_CC2530常用的控制寄存器
  2. android 断开蓝牙连接,如何在android中连接和断开扬声器蓝牙
  3. mysql group by 规则_MySQL 中关于 GROUP BY 的问题
  4. java orm框架什么意思_ORM框架是什么
  5. php sodium 加密解密,sodium库(加密)
  6. win7可以安装sqlserver2008 企业版吗_MYSQLServer2008R2详细的图文安装教程
  7. 安卓平板排行榜_shopee虾皮台湾安卓市场, shopee虾皮直播下载
  8. mysqldump全量恢复_删库不跑路-详解MySQL数据恢复
  9. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)
  10. DateUtils常用方法