事件的接收与忽略的示意图如下图:

                

  依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制。在一个特殊的情形下,我们必须使用accept()和ignore()函数,那就是窗口关闭的事件对于窗口关闭Qcloseevent事件,调用accept()意味着Qt会停止事件的传播,窗口关闭,调用ignore()则意味着事件继续传播,即阻止窗口关闭。

工程文件图,如下图:

          

ui界面图:

mybutton.h:

#ifndef MYBUTTON_H
#define MYBUTTON_H #include <QPushButton> class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = ); protected:
//重定义鼠标点击事件
void mousePressEvent(QMouseEvent *e); signals: public slots:
}; #endif // MYBUTTON_H

mywidget.h:

#ifndef MYWIDGET_H
#define MYWIDGET_H #include <QWidget>
#include <QMouseEvent>
namespace Ui {
class MyWidget;
} class MyWidget : public QWidget
{
Q_OBJECT public:
explicit MyWidget(QWidget *parent = );
~MyWidget(); protected: //重写鼠标点击事件
void mousePressEvent(QMouseEvent *); //关闭事件
void closeEvent(QCloseEvent *event); private:
Ui::MyWidget *ui;
}; #endif // MYWIDGET_H

mybutton.cpp:

#include "mybutton.h"

#include <QMouseEvent>
#include <QDebug>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{ }
void MyButton::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton)
{
//这里假设为信号的接收
//如果是左键按下
qDebug()<<"按下的是左键";
//事件接收后,就不会往下传递
e->ignore();//忽略,事件继续往下传递,那么给谁传递呢?
//事件传递给了父组件,不是给父类(基类)即MyButton,在这里就是传递给了 MyWidget ,为了验证到底是不是给了它,
//这里在MyWidget类中重写鼠标点击事件,如果MyWidget类中的鼠标点击事件发生,那么就是。
//经过验证程序执行了qDebug()<<"+++++++++++++++0";那么就是传递给了 MyWidget,
// 不是给父类(基类)即MyButton类中的事件 qDebug()<<"按钮被按下";
//值得一提的是,ignore()一般不是在这种事件中使用的,而是在closeEvent这种事件中使用的最多。即关闭窗口的时候使用
//可以对MyWidget类中的closeEvent事件进行重写,让其出现提示窗口。
}
else
{
//事件需要继续的往下传递
//这里假设为信号的忽略
//不做处理
QPushButton::mousePressEvent(e);
//事件的忽略,事件继续往下传递
}
}

mywidget.cpp:

#include "mywidget.h"
#include "ui_mywidget.h" #include <QDebug>
#include<QMessageBox>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
connect(ui->pushButton,&MyButton::clicked,[=](){
qDebug()<<"按钮被按下";
});
} MyWidget::~MyWidget()
{
delete ui;
} void MyWidget::mousePressEvent(QMouseEvent *e)
{
qDebug()<<"+++++++++++++++0";
} //MyWidget类中的closeEvent事件进行重写,让其出现是否关闭的提示窗口。
void MyWidget::closeEvent(QCloseEvent *event)
{
int ret = QMessageBox::question(this,"QQQQQ","是否关闭"); if (ret == QMessageBox::Yes)
{
//关闭窗口
//处理关闭窗口事件,接收事件,事件就不会再往下传递
event->accept();
}
else
{
//不关闭窗口
//忽略事件,事件继续给父组件传递
event->ignore();
}
}

Qt+事件的接收和忽略的更多相关文章

  1. qt事件机制(转)

    学习了一段时间的Qt之后,发现Qt的事件机制和其他语言的机制有些不同.Qt除了能够通过信号和槽机制来实现一些Action动作之外,还可以用对象所带的事件,或者用户自定义的事件来实现对象的一些行为处理. ...

  2. Qt 学习之路 2(19):事件的接受与忽略

    Home / Qt 学习之路 2 / Qt 学习之路 2(19):事件的接受与忽略 Qt 学习之路 2(19):事件的接受与忽略  豆子  2012年9月29日  Qt 学习之路 2  140条评论 ...

  3. Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)

    版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...

  4. QT事件

    qtevents多线程工作object存储 Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不错的文章,是2004年季刊的一篇文章,网上有这篇文 ...

  5. Qt 事件机制

    [1]事件 事件是可以被控件识别的操作.如按下确定按钮.选择某个单选按钮或复选框. 每种控件有自己可识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件等等. 事件就是用户对窗口 ...

  6. PyQt学习随笔:Qt事件类QEvent详解

    QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通 ...

  7. Qt事件机制浅析(定义,产生,异步事件循环,转发,与信号的区别。感觉QT事件与Delphi的事件一致,而信号则与Windows消息一致)

    Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...

  8. qt事件传递过程和处理

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  9. 【转】QT事件传递与事件过滤器

        [概览] 1.重载特定事件函数.    比如: mousePressEvent(),keyPressEvent(),  paintEvent() .     2.重新实现QObject::ev ...

随机推荐

  1. Linux文件IO操作函数概述

    文件概述 Linux中,一切皆文件.文件为操作系统服务和设备提供了一个简单而一致的接口.这意味着程序完全可以像使用文件那样使用磁盘文件.串行口.打印机和其他设备. 也就是说,大多数情况下,你只需要使用 ...

  2. 细说CSS中的display属性

    相信大部分奋战在前端的,尤其在前端攻城的过程中,有一种越陷越深的感觉,不错,一如前端深似海,从此妹子是浮云啊,前端上手容易,深入难啊!下面我就CSS中的display属性讲下我自己所积累的,与大家共享 ...

  3. Git之通过ssh clone代码

    1.git平台:码云 2.服务器系统:Linux 1.在Linux中创建ssh公钥,将创建的公钥添加到码云的ssh公钥管理 2.一般来说我们配置完站点之后,都会生成一个站点对应的文件夹,进入文件夹,然 ...

  4. 阻塞调用ShellExecute函数

    SHELLEXECUTEINFO si;ZeroMemory(&si, sizeof(si));si.cbSize = sizeof(si);si.fMask = SEE_MASK_NOCLO ...

  5. laravel 布局 详解(实例)

    在resources/views里创建layouts,并在layouts里创建app.blade.php, 这个php文件放的就是你的页面框架,也就是多页面公用的内容,如下 <!DOCTYPE ...

  6. java 三大基本特征

    java中的面向对象的三大基本特征是:[封装].[继承].[多态] 封装:对象要有一个明确的边界:边界的划分(对象各司其职.对象的粒度.对象的可重用性) 属性(bean.pojo):私有的privat ...

  7. 在虚拟机中设置NAT模式实现主机和虚拟机的通信

    1.打开虚拟机,对几个节点进行网络连接的设置.虚拟机设置/网络连接,选择“NAT模式” 2.编辑—>虚拟网络编辑器来查看NAT模式中所用到的网段. 从上图可以看出,NAT中的子网IP是192.1 ...

  8. IOS蓝牙连接 初步简单封装使用

    最近写一个蓝牙项目 初步实现一下蓝牙设备连接交互,后期继续完善.... 1.连接蓝牙相关操作 BlueToothManger.h // // BlueToothManger.h // SmartRob ...

  9. Restful API官方文档

    理解Restful架构:http://www.ruanyifeng.com/blog/2011/09/restful RESTful设计指南:http://www.ruanyifeng.com/blo ...

  10. MFC中的模态对话框与非模态对话框

    模态对话框创建: MyDialog mydlg; mydlg.DoModal() 当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行. 模态对话框的关闭顺序: OnCl ...