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

                

  依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制。在一个特殊的情形下,我们必须使用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. UTF-8和Unicode互转

    1.Unicode转UTF-8 void CodeCovertTool::UNICODE_to_UTF8(const CString& unicodeString, std::string&a ...

  2. HDU5997 【线段树】

    思路: 用vector存一下各种颜色的区间,每次处理颜色的区间,相同颜色不需要更新.区间最多1e6个没错,但是随着颜色的更替区间只会越来越少. 维护区间左右两端的颜色,lazy一下. 区间合并的时候 ...

  3. Codevs 1141 数列

    1141 数列 题目描述 Description 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9, ...

  4. [Xcode 实际操作]一、博主领进门-(11)代码区的样式设置,设置模拟器启动的声音

    目录:[Swift]Xcode实际操作 本文将演示如何对Xcode代码区进行样式设置,从而调整代码的外观属性.随便打开一份代码文件. [Xcode]->[Preferences]参数设置-> ...

  5. Mysql相关函数使用和总结(cast、convert)

    一.类型转换 1.获取一个类型的值,并产生另一个类型的值,CAST()和CONVERT()函数. 用法: CAST(value as type); CONVERT(value, type); 解释:C ...

  6. 自然语言处理(三)——PTB数据的batching方法

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 从文本文件中读取数据,并按照下面介绍的方案将数据整理成batch. 方法是:先将整个文档切分成若干连续段落,再让b ...

  7. C#连接Sqlite实现单表操作

    今天我们来了解下VS使用的众多数据库中比较轻量的数据库SQLITE,好处当然就在于“轻~”!!!.自己理解

  8. VLAN-4-在路由器上配置Trunk

    VLAN Trunk技术可以用在路由器和主机上,也可以用在交换机上.路由器不支持DTP,所以工程师必须手动配置. 路由器Trunk需要使用子接口(在一个接口中实现多个vlan间的路由和通信),每个子接 ...

  9. 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)

    https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...

  10. python入门之冒泡排序

    原理: (白话描述)一列数,从左到右,依次两两比较,若左边的数大于右边的数,则两数交换,始终保持比较后左边的数小于右边的数,这样从第一个到最后一个数全部比较一次就会把这列数中的最大值排到最后(最右边) ...