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

                

  依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制。在一个特殊的情形下,我们必须使用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. lightoj1006【记忆化搜索(我是这么叫)】

    搜索的时候记录一下,注意要long long: #include<cstdio> #include<queue> #include<map> #include< ...

  2. unity常用插件

    Unity3D常用插件,网址:http://jingyan.baidu.com/article/7f766daf4ef2844100e1d079.html ,想想自己也有小半年unity经验了,于是整 ...

  3. cf786C(xjb)

    题目链接:http://codeforces.com/problemset/problem/768/C 题意:给出一个数组,经过k次操作后最大元素和最小元素分别是什么.. 操作:给当前数组排序,再将第 ...

  4. bzoj 3158: 千钧一发【最小割】

    这个条件非常妙啊,奇数和奇数一定满足1,因为\( (2a+1)^2+(2b+1)^2=4a^2+4a+4b^2+4b+2=2(2(a^2+a+b^2+b)+1) \)里面这个一定不是平方数因为除二后是 ...

  5. IT兄弟连 JavaWeb教程 JSP动作指令

    JSP动作指令语法 JSP动作指令语法格式如下: <jsp:动作名 属性名1="属性值1" 属性名2="属性值2" ... %> JSP具体动作指令 ...

  6. 从MySQL高可用引出对高可用架构设计的一些思考

    高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 假设系统一直能够提供服务,我们说系统的可用性是100%.如果 ...

  7. Mybatis分页中遇到的坑2

    站在巨人的肩膀上    http://crocutax.com/blog/mybatis-one-to-many-nestes-query-and-page-query Mybatis一对多嵌套查询和 ...

  8. PAT甲级——1126 Eulerian Path

    我是先在CSDN上发布的这篇文章:https://blog.csdn.net/weixin_44385565/article/details/89155050 1126 Eulerian Path ( ...

  9. django 之 rest framework

    一 二 三 四 五 六 七 八

  10. Retrofit实现Delete请求

    //设置取消关注 @Headers("Content-Type:application/x-www-form-urlencoded") @HTTP(method = "D ...