在QT中,鼠标事件包含:鼠标按键按下,鼠标按键释放,鼠标双击事件,鼠标移动事件。
分别由下面的event handler(事件处理器,实际上就是一些可override的函数)来处理:

virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);

鼠标事件属于冒泡事件,鼠标事件会一直随着其父链一直路由下去,直到有其祖先所在的widget接受它,或者有事件过滤器消耗它。

注意:如果鼠标事件被路由到包含Qt:: WA_NoMousePropagation窗口属性(即该属性设置为true)的窗口小部件,该鼠标事件不会进一步沿着父控件链路由。如下代码:

#include "MainWindow.h"
#include<QMouseEvent>
#include <QPainter>
#include <QDebug>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>MainWindow::MainWindow(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);this->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);this->setFixedSize(500, 500);QWidget* wg1 = new QWidget(this);wg1->setFixedSize(300, 300);wg1->setStyleSheet("background-color:black;");QWidget* wg2 = new QWidget(wg1);wg2->setFixedSize(100, 100);wg2->setStyleSheet("background-color:red;");QHBoxLayout* m_layout = new QHBoxLayout;wg2->setLayout(m_layout);QPushButton* m_btn1 = new QPushButton(wg2);m_layout->addWidget(m_btn1);m_btn1->setText("--btn1--");// 当属性为false时,下面这句可以屏蔽,因为该属性默认就是flase的m_btn1->setAttribute(Qt::WA_NoMousePropagation, false);QLabel* m_label = new QLabel(wg2);m_label->setFixedSize(20, 100);m_layout->addWidget(m_label);m_label->setStyleSheet("background-color:pink");// 按钮鼠标跟踪事件要设置为true,否则鼠标在按钮上移动不会激发mouseMoveEventm_btn1->setMouseTracking(true); setMouseTracking(true);wg1->setMouseTracking(true);wg2->setMouseTracking(true);}void MainWindow::mouseMoveEvent(QMouseEvent* event)
{QPoint p_ab = event->globalPos();QPoint p_re = event->pos();QString str;str = QString("%1 , %2").arg(p_ab.x()).arg(p_ab.y());qInfo() << str;}

运行结果如下:

可以看到,当按钮的Qt::WA_NoMousePropagation属性设置为false时,鼠标在按钮上的移动事件传递到MainWindow中了。当改为下面代码

m_btn1->setAttribute(Qt::WA_NoMousePropagation, true);

则MainWindow无法收到鼠标在按钮上的移动事件

Qt::WA_NoMousePropagation用法相关推荐

  1. Qt sender()用法详解

    sender()是QObject类的方法,声明如下: QObject *sender() const; Qt助手的解释如下: Returns a pointer to the object that ...

  2. Qt Creator用法详解

    Qt自带集成开发环境(IDE),名为Qt Creator.它可以在Linux.OS X和Windows上运行,并提供智能代码完成.语法高亮.集成帮助系统.调试器和剖析器集成,还集成了所有主要的版本控制 ...

  3. QT QTableWidget 用法总结

    QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到QTableWidget,就必须讲一下它跟QTabelView的区别了.QTableWidge ...

  4. Qt::WA_QuitOnClose用法

    Qt官方助手对该标志的解释如下: Makes Qt quit the application when the last widget with the attribute set has accep ...

  5. Qt::WA_TransparentForMouseEvents用法

    Qt助手中对Qt::WA_TransparentForMouseEvents的解释如下: When enabled, this attribute disables the delivery of m ...

  6. qt repaint 用法_qt的repaint的问题

    qt的repaint的问题 在网上找了个qt刷屏的程序, 下面是主要代码,在main函数中调用showSlot程序,以便读取图形文件,但是遇到了奇怪的问题, 程序在linux PC端运行良好,用的是u ...

  7. qt repaint 用法_Qt重绘之update,repaint详解

    Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能. 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的p ...

  8. qt repaint 用法_Qt 中update()和repaint()的区别

    void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 通过立即调用paintEvent()来直接重新绘 ...

  9. qt repaint 用法_Qt常用函数 记录(update erase repaint 的区别)

    一界面重载函数 使用方法: 1在头文件里定义函数 protected: void paintEvent(QPaintEvent *event); 2 在CPP内直接重载 void ---------- ...

最新文章

  1. 面对别人强行关机你怎么办与 定时关机
  2. ubuntu g++编译32位应用
  3. mysql 服务启动异常
  4. 安卓之上传文件,即HTTP提交表单
  5. Kafka解析之topic创建(2)
  6. Flask服务部署与简单内网穿透
  7. cv2 imshow窗口大小_cv2.imshow()图片无法显示
  8. 如何申请注销腾讯视频账号
  9. sed高级命令及模式空间和交换空间简介
  10. xp系统如何更改计算机用户名,windows xp电脑如何设置、修改开机密码
  11. JavaWeb 图书推荐
  12. Flink1.10.1编译hadoop2.7.2 编译flink-shaded-hadoop-2-uber
  13. 966. 元音拼写检查器
  14. normal模式/loader模式/MASKROM模式
  15. 计算机基础--作业5,计算机基础第5次作业-第五章-Powerpoint知识题 (精选可编辑)...
  16. 自行更换内存条的操作规范
  17. Pango显示文字,并保存为图片
  18. 【体验系列】云IDE使用初体验
  19. 练就“白骨精”的七层心法
  20. 6G推进组:超大规模天线技术研究

热门文章

  1. 闲谈:我为什么热爱开源
  2. QuartusII下verilog设计使用OC8051和VGA两个IP核组成片上系统
  3. FPGA基础之LUT详解
  4. python executescript_在selenium中一些相对常用的JavaScript事件
  5. ttc error oracle,ORA-03137: TTC protocol internal error : [12333]错误一例
  6. 智能运维监管系统终端_智能运维系列(十三)| 面向智能化运维的CMDB系统构建...
  7. break后面的语句还执行吗_【自学C#】|| 笔记 5 条件语句if、switch
  8. Sereja and Brackets CodeForces - 380C (树状数组+离线)
  9. IDEA无法通过类加载器获取resources文件夹配置文件解决办法
  10. 编译时,输出信息重定向到文件